- PHP — делаем проверку наличия HTTPS или редирект
- Похожие записи
- Получаем HTTP статус-коды сайта с помощью PHP и CURL
- 301 редирект на php – как сделать
- Редирект страницы
- Редирект каждой страницы на такую же страницу другого домена
- Проверка редиректа
- Полезные материалы:
- PHP: проверить, перенаправляет ли URL-адрес?
- 11 ответы
PHP — делаем проверку наличия HTTPS или редирект
Задача: Не всегда получается настроить .htaccess для принудительного редиректа на протокол HTTPS и как-то необходимо выкручиваться!
Если мы знаем, где находится код, отвечающий за роутинг нашего сайта (запросы в базу данных и вывод контента), мы можем до загрузки страницы инициировать проверку наличия HTTPS в адресной строке и перенаправить на него, в случае отсутствия.
Обычно за роутинг отвечает корневой index.php. В нем может располагаться конструкция SWITCH–CASE или же вызов метода класса, который содержит в себе такую конструкцию. Также это может быть и абсолютно иной подход!
Для инициации проверки наличия HTTPS в адресной строке воспользуемся суперглобальным массивом $_SERVER
Логика очень проста: если отсутствует HTTPS, делать редирект на него и добавлять запрашиваемый URL (внутренняя страница или реф. ссылка сохраняется). А в ELSE мы перемещаем наши SWITCH–CASE.
Похожие записи
PHP — это серверный язык программирования со своими плюсами и минусами. Его давно хоронят, но он прочно закрепился в своей.
В современном мире практически каждый человек может ощутить на себе серьезное влияние технологий. Технические средства начинают внедряться практически во все.
Laravel — масштабный PHP фреймворк, который отлично подойдет для повышения навыков разработки на данном языке и будет хорошей альтернативой не.
Каждый, кто работает с PHP кодом в определенный момент осознает, что привычные реакторы, для написания HTML / CSS / JS.
В свое время баловался переделкой движков и плагинов финансовых проектов (CAP, MLM) и была проблема с автоматизацией продаж. Точнее, с.
Получаем HTTP статус-коды сайта с помощью PHP и CURL
Используя нижеприведенный код вы сможете проверить, существует сайт или нет. Также можно проверить, есть ли на сайте редирект. Это может быть полезно для сайтов-каталогов, которые хотите проверить урлы, которые больше не являются активными или обновить свои ссылки. С помощью CURL мы получаем все статус коды для какого либо сайта, а затем ищем совпадения со списком HTTP статус-кодов.
$toCheckURL = «http://google.com» ; // Домен для проверки
curl_setopt( $ch , CURLOPT_URL, $toCheckURL );
curl_setopt( $ch , CURLOPT_HEADER, true);
curl_setopt( $ch , CURLOPT_NOBODY, true);
curl_setopt( $ch , CURLOPT_RETURNTRANSFER, true);
curl_setopt( $ch , CURLOPT_FOLLOWLOCATION, true);
curl_setopt( $ch , CURLOPT_MAXREDIRS, 10); // разрешаем только 10 редиректов за раз во избежание бесконечного цикла
$http_code = curl_getinfo( $ch , CURLINFO_HTTP_CODE); // Получаем HTTP-код
$new_url = curl_getinfo( $ch , CURLINFO_EFFECTIVE_URL);
// Массив возможных HTTP статус кодовв
$codes = array (0=> ‘Domain Not Found’ ,
203=> ‘Non-Authoritative Information’ ,
407=> ‘Proxy Authentication Required’ ,
413=> ‘Request Entity Too Large’ ,
415=> ‘Unsupported Media Type’ ,
416=> ‘Requested Range Not Satisfiable’ ,
500=> ‘Internal Server Error’ ,
505=> ‘HTTP Version Not Supported’ );
// Ищем совпадения с нашим списком
if (isset( $codes [ $http_code ]))
echo ‘Сайт вернул ответ: ‘ . $http_code . ‘ — ‘ . $codes [ $http_code ]. ‘
‘ ;
preg_match_all( «/HTTP/1.[1|0]s(d)/» , $data , $matches );
// Идем дальше по списку, чтобы посмотреть, какие мы еще статус коды получили
// Проверяем если урл поменялся или нет
301 редирект на php – как сделать
Наша статья о 301 редиректе с помощью .htaccess взорвала интернет и собрала уже более полумиллиона просмотров. htaccess – один из самых удобных, но единственных способов перенаправить страницу. Если у вас сайт на php, то вы можете воспользоваться данной инструкцией. Если у вас самописный сайт, который состоит из набора .php страниц, то для переадресации со старого URL на новый, вам нужно добавить в самый верх файл кусок кода с редиректом на нужную страницу.
Редирект страницы
header("HTTP/1.1 301 Moved Permanently"); header("Location: https://domain.ru/test.html"); exit();
Если редиректов на php нужно поставить много, то есть смысл составить отдельный файл, который будет содержать в себе все правила, например redirect.php.
if($_SERVER['REQUEST_URI'] == '/old-url-1/') < header("HTTP/1.1 301 Moved Permanently"); header("Location: https://domain.ru/new-url-1/"); exit(); >if($_SERVER['REQUEST_URI'] == '/old-url-2/') < header("HTTP/1.1 301 Moved Permanently"); header("Location: https://domain.ru/new-url-2/"); exit(); >
Таких правил можно написать сколько угодно, организовать условия синтаксически – тоже можно по-разному. Далее такой файл подключается к вашему сайту.
Редирект каждой страницы на такую же страницу другого домена
$ref=$_SERVER["QUERY_STRING"]; if ($ref!="") $ref="?".$ref; header("HTTP/1.1 301 Moved Permanently"); header("Location: https://domen.ru/".$ref); exit();
Проверка редиректа
Проверить переадресацию как для браузера, так и для робота:
- Простой, удобный и функциональный – https://www.bertal.ru/
- В Яндекс.Вебмастере: https://webmaster.yandex.ru/tools/server-response/
Полезные материалы:
PHP: проверить, перенаправляет ли URL-адрес?
Я реализовал функцию, которая запускается на каждой странице, которую я хочу ограничить от пользователей, не вошедших в систему. Функция автоматически перенаправляет посетителя на страницу входа в систему, если он или она не вошли в систему.
Я хотел бы создать функцию PHP, которая запускается с внешнего сервера и выполняет итерацию по ряду установленных URL-адресов (массив с URL-адресами для каждого защищенного сайта), чтобы узнать, перенаправляются ли они или нет. Таким образом, я мог легко убедиться, что защита включена и работает на каждой странице.
Как это можно было сделать?
Как перенаправить? С какого клиента звонили? Когда авторизован или не авторизован? Зачем? Придется ли скрипту обрабатывать файлы cookie сеанса и другие сложные вещи? — Pekka
Определите, пожалуйста, «перенаправленный URL». — Vladislav Rastrusny
это больше похоже на сканер для поиска уязвимости на другом сервере. — Your Common Sense
Обновился снова. Сканер на самом деле неплохое описание. Мы будем запускать несколько экземпляров на главном сервере приложения, и каждое приложение может немного отличаться и модифицироваться в зависимости от клиента. Поэтому очень интересно провести тест, чтобы определить, что защита паролем работает повсюду. — Industrial
11 ответы
$urls = array( 'http://www.apple.com/imac', 'http://www.google.com/' ); $ch = curl_init(); curl_setopt($ch, CURLOPT_HEADER, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); foreach($urls as $url) < curl_setopt($ch, CURLOPT_URL, $url); $out = curl_exec($ch); // line endings is the wonkiest piece of this whole thing $out = str_replace("\r", "", $out); // only look at the headers $headers_end = strpos($out, "\n\n"); if( $headers_end !== false ) < $out = substr($out, 0, $headers_end); >$headers = explode("\n", $out); foreach($headers as $header) < if( substr($header, 0, 10) == "Location: " ) < $target = substr($header, 10); echo "[$url] redirects to [$target]
"; continue 2; > > echo "[$url] does not redirect
"; >
Вы также можете использовать curl_getinfo ($ ch, CURLINFO_HTTP_CODE) для чтения кода состояния (301 или 302) — Балу
Вы также можете сэкономить некоторую пропускную способность и вычислительную мощность, если используете curl_setopt($handle, CURLOPT_NOBODY, true); . Будет отправлен только HTTP-запрос HEAD. Так вам не придется отрезать тело. См. Также эту статью: schlitt.info/opensource/blog/… — чиборг
Я новичок в php. Он показывает мне фатальную ошибку: вызов неопределенной функции curl_init () в C: \ wamp \ www \ redirect-checker.php в строке 3 — Сандип Паттанаик
Эта ошибка обычно означает, что на вашем сервере не включен cURL. Скорее всего, вам нужно будет найти файл php.ini и найти строку ;extension=php_curl.dll . Удалите точку с запятой из этой строки или, если строка отсутствует, добавьте ее без начальной точки с запятой и перезапустите сервер WAMP. Думаю, тогда это должно сработать. — ПРОГРАММА_IX
@chiborg следует отметить, что многие серверы отбрасывают запросы HEAD. — Greatwitenorth
Я использую curl и беру только заголовки после того, как сравниваю свой url и url из заголовка curl:
$url="http://google.com"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_TIMEOUT, '60'); // in seconds curl_setopt($ch, CURLOPT_HEADER, 1); curl_setopt($ch, CURLOPT_NOBODY, 1); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $res = curl_exec($ch); if(curl_getinfo($ch)['url'] == $url)< echo "not redirect"; >else
отлично работает на локальном хосте, но не на моем веб-сервере. Что я мог сделать не так? — Дипаншу Махла
Вы всегда можете попробовать добавить:
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
поскольку 302 означает, что он перемещен, позвольте вызову curl следовать за ним и возвращать все, что возвращает перемещенный URL.
ЭТО . на самом деле правильный ответ. Спасибо! Похоже, что без этого curl останавливается на контенте, который он получает первым, и не следует за перенаправлением, если оно есть. Спасибо. — Шаррон Денис
Я не уверен, действительно ли это имеет смысл для проверки безопасности.
Если вы беспокоитесь о том, что файлы будут вызываться напрямую, без вашего ответа «пользователь вошел в систему?» выполняемых проверок, вы могли бы делать то же самое, что и многие большие проекты PHP: в центральном включаемом файле (где выполняется проверка безопасности) определите константу BOOTSTRAP_LOADED или что-то еще, и в каждом файле проверьте, установлена ли эта константа.
Тестирование — это здорово, а тестирование безопасности еще лучше, но я не уверен, какой недостаток вы хотите выявить с помощью этого? Мне эта идея кажется пустой тратой времени, которая не принесет никакой реальной дополнительной безопасности.
Просто убедитесь, что ваш сценарий die() s после header(«Location. «) перенаправить. Это важно для предотвращения отображения дополнительного контента после команды заголовка (кстати, отсутствующий die () не будет пойман вашей идеей, поскольку заголовок перенаправления все равно будет выдан . )
Если вы действительно хотите это сделать, вы также можете использовать такой инструмент, как wget и скормить ему список URL-адресов. Попросите его получить результаты в каталог и проверить (например, посмотрев на размеры файлов, которые должны быть идентичными), каждая ли страница содержит диалог входа в систему. Просто чтобы добавить еще один вариант .
Вы хотите проверить код HTTP, чтобы убедиться, что это перенаправление?
$params = array('http' => array( 'method' => 'HEAD', 'ignore_errors' => true )); $context = stream_context_create($params); foreach(array('http://google.com', 'http://stackoverflow.com') as $url) < $fp = fopen($url, 'rb', false, $context); $result = stream_get_contents($fp); if ($result === false) < throw new Exception("Could not read data from "); > else if (! strstr($http_response_header[0], '301')) < // Do something here >>
Вы можете использовать сеанс, если массив сеанса не установлен, URL-адрес перенаправлен на страницу входа. .
Вот как в основном основана моя безопасность, но я не могу видеть, перенаправляет ли страница из массива или нет. — Промышленное
Я изменил ответ Адама Бэкстрема и реализовал предложение чиборга. (Скачать только HEAD). У него есть еще одна вещь: он проверяет, есть ли перенаправление на странице того же сервера или нет. Пример: terra.com.br перенаправляет на terra.com.br/portal. PHP будет рассматривать это как перенаправление, и это правильно. Но я хотел только указать этот URL-адрес, который перенаправляет на другой URL-адрес. У меня плохой английский, поэтому, если кто-то нашел что-то действительно трудное для понимания и может это отредактировать, милости просим.
function RedirectURL() < $urls = array('http://www.terra.com.br/','http://www.areiaebrita.com.br/'); foreach ($urls as $url) < $ch = curl_init(); curl_setopt($ch, CURLOPT_HEADER, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // chiborg suggestion curl_setopt($ch, CURLOPT_NOBODY, true); // ================================ // READ URL // ================================ curl_setopt($ch, CURLOPT_URL, $url); $out = curl_exec($ch); // line endings is the wonkiest piece of this whole thing $out = str_replace("\r", "", $out); echo $out; $headers = explode("\n", $out); foreach($headers as $header) < if(substr(strtolower($header), 0, 9) == "location:") < // read URL to check if redirect to somepage on the server or another one. // terra.com.br redirect to terra.com.br/portal. it is valid. // but areiaebrita.com.br redirect to bwnet.com.br, and this is invalid. // what we want is to check if the address continues being terra.com.br or changes. if changes, prints on page. // if contains http, we will check if changes url or not. // some servers, to redirect to a folder available on it, redirect only citting the folder. Example: net11.com.br redirect only to /heiden // only execute if have http on location if ( strpos(strtolower($header), "http") !== false) < $address = explode("/", $header); print_r($address); // $address['0'] = http // $address['1'] = // $address['2'] = www.terra.com.br // $address['3'] = portal echo "url (address from array) = " . $url . "
"; echo "address[2] = " . $address['2'] . "
"; // url: terra.com.br // address['2'] = www.terra.com.br // check if string terra.com.br is still available in www.terra.com.br. It indicates that server did not redirect to some page away from here. if(strpos(strtolower($address['2']), strtolower($url)) !== false) < echo "URL NOT REDIRECT"; >else < // not the same. (areiaebrita) echo "SORRY, URL REDIRECT WAS FOUND: " . $url; >> > > > >