Проверка на редирект php

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; >> > > > >

Источник

Читайте также:  Working with div css
Оцените статью