Как найти редирект в коде

Как посмотреть все редиректы запроса?

Я делаю запрос и пытаюсь посмотреть историю редиректов.

response = requests.get(url=...)

print(response.history)

У меня есть подозрение что туда падают далеко не все. Есть еще какой нибудь способ увидеть все редиректы?


  • Вопрос задан

    более года назад

  • 145 просмотров

Туда попадают только редиректы через коды ответа HTTP 3XX.
Javascript-редиректы или тег meta-refresh сработают в браузере, но requests их не обрабатывает, и потому ничего о них не знает.
Ещё один возможный механизм — DNS-запись CNAME для запрошенного доменного имени. Не уверен насчёт её реализуемости и взаимодействия с requests, но я сомневаюсь, что это будет замечено.

Пригласить эксперта


  • Показать ещё
    Загружается…

27 мая 2023, в 23:03

10000 руб./за проект

27 мая 2023, в 22:55

1000 руб./за проект

27 мая 2023, в 22:42

500000 руб./за проект

Минуточку внимания

Is there any way to detect whether a webpage is going to redirect me to another, knowing its URL? I mean the situation when you type URL in a text field and the script examines it for 3xx redirections.

Josh Leitzel's user avatar

Josh Leitzel

15k13 gold badges59 silver badges76 bronze badges

asked Mar 9, 2012 at 17:43

burtek's user avatar

4

Yes, you can do this quite easily in Javascript. It’d look something like:

var xhr = new XMLHttpRequest();
xhr.onload = function() {
  if (this.status < 400 && this.status >= 300) {
    alert('this redirects to ' + this.getResponseHeader("Location"));
  } else {
    alert('doesn't redirect ');
  }
}
xhr.open('HEAD', '/my/location', true);
xhr.send();

Unfortunately, this only works on your own server, unless you hit a server with CORS set up. If you wanted to work uniformly across any domain, you’re going to have to do it server-side.

answered Oct 1, 2012 at 18:36

saml's user avatar

samlsaml

6,6821 gold badge34 silver badges30 bronze badges

1

Here is simple solution for your question.

x.addEventListener('readystatechange',function(){

    const url = 'https://your/request/url';
    if(this.responseURL != url){
        alert('redirected');
    }

});

answered May 7, 2021 at 12:48

stack 's user avatar

stack stack

14 bronze badges

This is what I recently did to detect a redirect and expose it as a custom request header to the application: X-Redirect: 1 (using Apache’s mod_rewrite and mod_headers).

On the source side, I redirect all requests to the target server by prepending an additional /redirect to the URL path:

RewriteRule ^/(.*) http://target-server.com/redirect/$1 [L,R=permanent]

On the target side, I detect the /redirect in the path, strip it via another redirect, and inject a custom cookie into the response:

RewriteRule ^/redirect/(.*)$ /$1 [R=permanent,L,CO=redirect:1:target-server.com:86400:/]

Also on the target side, I convert the cookie into an environment variable, «disable» the cookie, then convert the env variable into a custom request header:

RewriteCond %{HTTP_COOKIE} redirect=1 [NC]
RewriteRule ^(.*)$ /$1 [L,CO=redirect:0:target-server.com:86400:/,E=redirect:1]
RequestHeader set X-Redirect 1 env=redirect

Виды редиректов

Различается по двум показателям:

  1. Постоянность или временность перенаправления;
  2. Доступность старой страницы после изменения настроек.

Рассмотрим виды подробнее.

300 «Множественный выбор» (Multiple Choices)

Код ответа возвращается, когда по одному URL доступно несколько вариантов контента. Например, когда для одной страницы доступно несколько языковых версий. Пользователю предоставляется возможность выбрать подходящую версию.

301 «Перемещена навсегда» (Moved Permanently)

Статус 301 указывает, что веб-сайт или страница навсегда изменили URL. Для запрашиваемой страницы существует новый адрес, по которому должны осуществляться обращения.

Для пользователя документ по старому адресу больше не доступен, а роботы поисковых систем увеличивают период для перехода страницы и со временем выкинут её из индекса.

Новый адрес наоборот же доступен, как и для посетителей, так и для роботов. Дополнительно поисковые боты будут понимать, что новая страница является преемником старого адреса и все характеристики страницы, будут перенесены на новый адрес.

301-редирект используется:

  1. Для удаления ненужной страницы из поиска и сохранения ее показателей на новой странице;
  2. Для удаления дублей. Это страница идентичная той, на которую идет настройка.

301 Redirect «Перемещена навсегда» (Moved Permanently)

Общий вид кода 301 «Перемещена навсегда» (Moved Permanently)

302 «Перемещена временно» (Moved Temporarily)

Код ответа 302 применяется для временных перенаправлений. Поскольку конечный адрес может быть изменен в любой момент, обозреватель должен продолжать использовать старый URL и дальше, но посетитель не увидит перемещенный документ.

Для поисковых систем это сигнал, что страница ещё вернется и удалять её не нужно, а страницу акцептор индексировать не требуется. Хотя если редирект будет настроен продолжительное время, то ПС могут его обработать, как 301 код ответа.

302-редирект используется:

  1. Временное перенаправления трафика с одного домена на другой;
  2. Если данные часто меняются и необходимо показать пользователю его новую версию.

Важно. Не используйте при переносе сайта и редиректе. ПС проиндексируют обе версии. Они воспримут это как полное дублирование. Высокая вероятность, что одну из версий признают некачественной и исключат из поисковой выдачи.

303 «Смотри другое» (See Other)

На практике код ответа 303 похож на 302, но он не обозначает перемещение запрашиваемого адреса. 303 код ответа сервера указывает что запрашиваемый ресурс находится по другому URL. Браузеру предоставляется только адрес. Он не кэшируется.

303-редирект используется: в интернет-магазинах для перенаправления людей со страницы где закончились товары на страницу с аналогичными характеристиками.

304 «Не модифицирован» (Not Modified)

Код ответа с сервера говорит, что страница не редактировалась со времени последнего кеширования. Поэтому браузеру/роботу не нужно дополнительно проверять страницу. SEO-специалисты применяют заголовки If-Modified-Since и Last-Modified для обновления данных кэша. Данный подход позволяет увеличить скорость обхода страниц.

Этот вид редиректа помогает снизить нагрузку на высоконагруженных проектах и на больших сайтах, на которых ПС могут сканировать не приоритетные для нас страницы. Поэтому до нужного контента робот может не добраться.

Рассмотрим 2 примера.

Предположим на сайте есть 1 млн. страниц, но есть 3 условия:

  1. Поисковый бот за 1 раз может обойти не более 50.000 страниц.
  2. Сканирование продолжается не более N минут.
  3. При сканировании сайта поисковый бот начинает обходить сайт с главной страницы.

Учитывая данные ограничения, то поисковые боты будут переходить ~примерно, по одним и тем же разделам. Что в свою очередь приводит к тому, что большая часть страниц сайта не обходится поисковыми ботами.

В этом случае нам и поможет код ответа 304. Когда наш сервер сообщает, что определенные страницы не изменялись с последнего сканирования и повторного сканирования она не требует. Это в свою очередь сообщает боту, что он может проверить другие страницы. Например, в первый раз бот обошел 50.000 страниц, ко второму сканированию изменились только 5.000 страниц, а 45.000 отдадут код 304. Значит во второе сканирование бот сможет получить актуальную информацию с 5.000 — обновленных страниц + 45.000 — страниц без изменения + 45.000 страниц, которые ранее бот не мог обойти. К 3-й попытке будет 5.000 — обновленных страниц + 90.000 — страниц без изменения + 45.000 новых страниц. И так итерацией за итерацией, бот обойдет весь сайт.

Второй пример, когда сайт очень высоко нагружен и в один момент времени необходимо производить частое обновление страницы. То чтобы снизить нагрузку, пользователю можно отдавать код 304 и сообщать, что страница не изменилась и заново скачивать информацию не требуется. Таким образом снижая нагрузку на сервер, пользователь обновляет информацию на сайте только в момент реального обновления информации на странице.

Важно! Данный редирект нужен не для всех проектов и нужно учитывать следующие моменты:

  • Этот вид редиректа актуален на больших сайтах, на которых ПС часто не доходят до нужного контента из-за сканирования неприоритетных страниц.
  • Поисковые системы не всегда учитываю данный код ответа. Поэтому перед внедрением лучше уточнить у поддержки ПС.

305 «Используй прокси» (Use Proxy)

Используется для анонимности. В ответ на запрос обозревателя сервер выдает адрес прокси-сервера. Подключение к сайту возможно только через него.

306 Зарезервировано

Код ответа указывает, что клиент должен использовать определенный прокси сервер. Сейчас это неактуально. Код остается зарезервированным.

307 «Временная переадресация» (Temporary Redirect)

Код ответа указывает, что сайт доступен по другому адресу. Страница не кэшируется. ПС не добавляют в индекс новый адрес.

Создан для уточнения 302. Единственное отличие — метод передачи запроса. 307 редирект сохраняет метод отправки (GET, POST), который указывает что страницу не нужно кешировать, а 302 — нет. 303 редирект работает по методу GET

308 Перемещено навсегда» (Permanent Redirect)

Это аналог 301-редиректа с разницей, что не позволяет заменить метод запроса с POST на GET. Данный метод может использоваться для настройки перенаправления на странице с 2-3 формами, данные в которых передаются методом POST. Например, Google Drive использует код ответа 308 чтобы показать, что передача информации прервана.

Важно! Данный метод экспериментальный и может не корректно отрабатывать.

Типы реализации редиректов

Рассмотренные виды редиректов отличаются друг от друга по функционалу. Существует и другой фактор классификации — техническое исполнение. По нему выделяются такие варианты: htaccess, PHP, JavaScript и HTML-редиректы. Рассмотрим их подробнее.

Htaccess

Htaccess — этот системный файл веб-сервера Apache. На хостинге расположен в корне сайта. Доступ к нему происходит через панель управления или FTP. Настройка редиректа происходит с помощью прописывания правил. Открывается любым текстовым редактором. Переадресация работает быстро и незаметно для пользователя. Подробнее работу с файлом .htaccess рассмотри далее.

Подробную работу с данным файлом разберем в разделе.

PHP

PHP — серверный язык программирования. Переадресация происходит не в исходном коде страницы, а скрипте на сервере. Работает медленнее чем редирект через файл .htaccess. Правила прописываются в index.php. Удобен если перенаправление делается выборочно, где много правил для отдельных страниц.

Настройка

Для создания редиректа применяется функция header(). Ее синтаксис: void header ( string $string [, bool $replace = true [, int $http_response_code ]] ). Рассмотрим на примере. Есть два файла redirect.php, и redirect2.php. В первом пропишите код:

		
<? php header('Location: http://localhost/ redirect2.php '); ?>
		
	

Во втором файле пропишите код: echo «Привет! Вы находитесь в файле redirect2.php»;

Перейдя по ссылке первого файла redirect.php, произойдет перенаправление.

Вид перехода по 301 редиректу

Переход по 301 редиректу

По умолчанию в заголовок передается редирект 302. В поисковые системы такое перенаправление может затянуться.

Рассмотрим пример принудительной перезаписи с 302 на 301:

		
<?php header('Location: http://localhost/redirect2.php',true, 301); ?>
		
	

Такое перенаправление возможно в два этапа.

  1. Перезапись кода состояния;
  2. Переход на новый адрес.
		
<?php  header('HTTP/1.1 301 Moved Permanently'); 
header('Location: http://redirect2.php');  ?>
		
	

Например. Перенаправление в зависимости от роли пользователя, определяется во время аутентификации. Значение для обработки записывается в переменную $who:

		
<?php	
switch ($who){
case "user": $redirect_url = "/blog.html"; break;
case "author": $redirect_url = "/author.html"; break;
case "admin": $redirect_url = "/admin.html"; break;
default: $redirect_url = "/registration.html";
}
header('HTTP/1.1 200 OK');
header('Location: http://'.$_SERVER['HTTP_HOST'].$redirect_url);
exit();
?>
		
	

Например, клик по ссылке ведет на страницу. С нее через пять секунд происходит переход на Рамблер.

Код HTML:

		
Нажми меня
		
	

Код файла redirect3.php:

		
<?php
header('Refresh: 5; url=http://rambler.ru/');
echo "Привет!Через 5 секунд вас выкинет на Рамблер))";
?>
		
	

Процесс 302 редиректа

Переход по 302 редиректу

JavaScript

Перенаправление происходит на стороне браузера. Скорость переадресации снижается, потому что скрипт должен загрузится для начала работы.

Способ не работает, если в браузере отключен JavaScript.

Как пользоваться

Пропишите код в одном файле с расширением js и добавляйте его на каждой странице прописав:

		
<script type="text/javascript" src="redirect.js"></script>
		
	

Редирект на другой сайт

		
<script type="text/javascript">
location="https://yandex.ru";
</script>
		
	

Перенаправление сработает на сайт yandex.ru.

Редирект на другой сайт с задержкой пять секунд:

		
<script> type="text/javascript">
setTimeout(function(){
location="https://yandex.ru";
}, 5000);
</script>
		
	

HTML

Создается в индексном файле внутри тегов

метатегом Refresh. Происходит в исходном коде страницы. Это означает что редирект производится непосредственно браузером.

Например, перенаправление настроено с index.html на new_index.html. Работает по схеме:

  1. Браузер запрашивает файл индексной страницы (index.html) на сервере;
  2. Сервер находит index.html и отвечает на запрос браузера;
  3. Браузер открывает индексную страницу. Считывает html-код. Находит строку с редиректом, затем — название нового URL;
  4. Веб-браузер отправляет на сервер запрос где хранится new_index.html;
  5. Сервер находит эту страницу. Отвечает на запрос браузера;
  6. Веб-обозреватель открывает ее.

Мета-тег выглядит так:

		
<meta http-equiv="refresh" content="0;URL=http://site.ru" />
		
	

Где:

  1. content — время ожидания перенаправления в секундах. Пропишите 0, чтобы перенаправление происходило мгновенно;
  2. URL — ссылка на новую страницу.

Как настроить редирект

Откройте index.html в нем пропишите:

		
<head>
<meta http-equiv="refresh" content="0;URL=http://site.ru" />
</head>			
		
	

Если на сайте установлен SSL-сертификат, укажите https:// вместо http://.

Получится следующее:

Настройка редиректа в index.html

Как настроить редирект в index.html

Настройка в .htaccess

Рассмотрим подробнее где расположен, как создать (если нет на хостинге) и настроить перенаправление в файле .htaccess.

Где найти файл .htaccess и принципы работы с ним

Данный файл используется только на серверах Apache. В зависимости от HTTP сервера могут использоваться: .config, .http, access.conf.

Файл .htaccess находится в корне сайта.

Как создать .htaccess

Чтобы создать файл, выполните следующие шаги:

  1. Откройте любой текстовый редактор, создайте пустой файл с расширением .txt;
  2. Переименуйте файл в .htссess, где «htссess» является расширением файла».
  3. Файл готов.

С чего начать файл

Перед правилом пропишите три директивы:

  1. RewriteEngineOn. Активирует механизм преобразование модуля mod_rewrite;
  2. Options+FollowSymLinks. Данный параметр позволяет в корневом каталоге иметь символическую (в ней вместо пользовательских данных прописан путь к файлу, открываемому при обращении к этой ссылке) ссылку указывающую на другую директорию;
  3. RewriteBase.Часть URL, которая дописывается вначале адресов, созданных после преобразования.В основном в них указывается слеш (/). Это означает что URL начинаются от корня сайта.

Важно. Прописывайте их вначале файла .htaccess, чтобы не повторять перед правилами.

Директивы

Директивы — это команды, которые прописываются в конфигурационном файле .htaccess. Все команды должны начинаться с новой строки.

Например, необходимо разрешить доступ к веб-сайту только с определенного IP. В htaccess пропишите:

		
Order allow deny
Deny from all
Allow from 192.112.12.198		
		
	

Где директива:

  1. Order. Далее указывается порядок выполнения команд;
  2. Deny. Запрет доступа всех пользователей к веб-сайту;
  3. Allow. За командой прописывается IP адрес попадающий в список исключений и открывающий ему доступ к директивам и файлам.

Флаги

После директивы RewriteRule прописываются флаги. Это два флага — [L,R=301]:

  1. L — команда на сервер для остановки преобразований после этой строки;
  2. R=301 —обозначение редиректа и его тип.

Порядок правил имеет значение

Директивы выполняются в таком порядке, в котором прописаны. Если правила пересекаются или противоречат один другому, выполняется то, что выше.

Расположите команды от страниц с высоким уровнем вложенности к страницам с низким.

Комментарии

Строки в файле, перед которыми находится знак решетки (#) не учитываются и не выполняются сервером. Оставляйте в них комментарии к правилам. Что это за команда и для чего создавалась. Используйте решетку для отключения неиспользуемых команд.

Файл .htaccess для редиректов

Внешний вид файла .htaccess

Кириллические адреса

Это название веб-сайта на русском языке. Например. телефон.рф. Такие адреса легче записывать в поисковой строке Яндекса или Google. Кириллические домены выбирают для веб-сайтов, ориентированных на русскоговорящую аудиторию.

Например, владельцы доменов на латинице регистрируют аналогичный домен на кириллице и настраивают перенаправление с русского домена на английский. Так, если прописать в адресную строку обозревателя домен «яндекс.рф», откроется «yandex.ru».

Чтобы настроить такой редирект, необходимо кириллические адреса перевести в punycode. И использовать в .htaccess URL формата punycode.

Для перевода используйте https://www.reg.ru/web-tools/punycode

Кириллические адреса в формате punycode для редиректа

Перевод кириллических адресов в формат punycode на reg.ru

Блок IfModule

Если на сервере нет модуля для редиректа, например mod_rewrite, это может вызывать ошибки. В исходном коде с правилами для mod_rewrite пропишите условие IfModule.

Например, если нужно добавить переадресацию:

		
RewriteCond%{HTTP_HOST} ^www.domain.ru$ [NC]
RewriteRule ^(.*)$ http://domain.ru/$1 [R=301,L]				
		
	

Чтобы не было ошибок, пропишите:

		
<IfModule mod_rewrite.c>
RewriteCond %{HTTP_HOST} ^www.domain.ru$ [NC]
RewriteRule ^(.*)$ http://domain.ru/$1 [R=301,L]
</IfModule>>				
		
	

Сервер, увидит условие (If), проверит, есть ли модуль mod_rewrite. Если нет — директивы внутри условия выполняться не будут.

Пробуем разные варианты

Прописали код с правилом в .htaccess, а редирект не сработал. Что делать? Посмотрите, какая установлена версия сервера Apache, найдите официальное руководство, посмотрите, как должны быть прописаны директивы.

Настройка 301 редиректа в .htaccess

Рассмотрим практические примеры. Адреса сайтов измените на свои.

Редирект с WWW — на без WWW

Вариант 1:

		
RewriteCond%{HTTP_HOST} ^www.(.*)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]			
		
	

Вариант 2:

		
RewriteCond %{HTTP_HOST} ^www..your-site.com$ [NC]
RewriteRule ^(.*)$ http://your-site.com/$1 [R=301,L]				
		
	

Перенаправление сайта без WWW на URL с WWW

Вариант 1:

		
RewriteCond%{HTTP_HOST} !^www..* [NC]
RewriteRule ^(.*) http://www.%{HTTP_HOST}/$1 [R=301]			
		
	

Вариант 2:

		
RewriteCond %{HTTP_HOST} ^your-site.com [NC]
RewriteRule ^(.*)$ http://www.your-site.com/$1[L,R=301,NC]				
		
	

Переход на HTTPS с HTTP

Вариант 1:

		
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI}[L,R=301]			
		
	

Вариант 2:

		
RewriteCond %{SERVER_PORT} !^443$
RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]				
		
	

Вариант 3:

		
RewriteCond %{HTTPS} =on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [QSA,L]
RewriteCond %{HTTPS} off
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI}[L,R=301]				
		
	

Вариант 4:

		
RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}[R=301,L]				
		
	

301-редирект с HTTPS-версии на HTTP

		
RewriteCond %{HTTPS} "on"
RewriteRule .* http://%{HTTP_HOST}%{REQUEST_URI}[R=301,L,QSA]
		
	

Устраняет дубли URL с HTTPS в индексе ПС.

Перенос сайта на версию с HTTPS

		
RewriteCond %{SERVER_PORT} ^80$ [OR]
RewriteCond %{HTTP} =on
RewriteRule ^(.*)$ https://domain.ru/$1 [R=301,L]
		
	

Редирект с страницы со / на URL без него, и наоборот

Рассмотрим оба способа

На URL без слеша

Вариант 1:

		
RewriteCond %{REQUEST_URI} !?
RewriteCond %{REQUEST_URI} !&
RewriteCond %{REQUEST_URI} !=
RewriteCond %{REQUEST_URI} !.
RewriteCond %{REQUEST_URI} ![^/]$
RewriteRule ^(.*)/$ /$1 [R=301,L]
		
	

Вариант 2:

		
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} ^(.+)/$
RewriteRule
^(.+)/$ /$1 [R=301,L]
		
	

На URL с “/” в конце

Вариант 1:

		
RewriteCond %{REQUEST_URI} !?
RewriteCond %{REQUEST_URI} !&
RewriteCond %{REQUEST_URI} !=
RewriteCond %{REQUEST_URI} !.
RewriteCond %{REQUEST_URI} !/$
RewriteRule ^(.*[^/])$ /$1/ [R=301,L]
		
	

Вариант 2:

		
RewriteCond %{REQUEST_URI} /+[^.]+$
RewriteRule ^(.+[^/])$ %{REQUEST_URI}/ [R=301,L]
		
	

Заменяем последовательно идущие редиректы на один

Идущие один за одним переадресации объедините в одно правило. Например, переадресации с URL с WWW сразу на адрес с протоколом HTTPS и без префикса WWW, минуя промежуточный редирект (с HTTP на HTTPS):

		
RewriteCond %{HTTP_HOST} ^www.(.*)$ [NC]
RewriteRule^(.*)$ https://%1/$1 [R=301,L]
		
	

Или второй вариант:

		
RewriteCond %{HTTP_HOST} ^www.(.*)$ [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]
RewriteCond %{HTTP:PORT} !^443$
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI}[L,R]
		
	

301-редирект одной страницы

Используйте директиву Redirect. Попробуйте один из вариантов:

		
Redirect301 /old-page /new-page
		
	

или

		
Redirect 301 /old-page/ https://your-site.com/new-page
		
	

Можно перенаправить и с помощью модуля mod_rewrite:

		
RewriteCond %{REQUEST_URI} ^/old-page/$
RewriteRule ^.*$ http://your-site.com/new-page/?[R=301,L]
		
	

Переадресация директории

		
RewriteRule ^(.*)/old-catalog/(.*)$ $1/new-catalog/$2 [R=301,L]
		
	

Второй вариант:

		
RewriteRule ^old-catalog /new-catalog/$1 [R=301,L]
		
	

Редирект на другой домен

Первый способ:

		
RewriteCond %{HTTP_HOST} ^old-your-site.com [NC,OR]
RewriteCond %{HTTP_HOST} ^www.old-your-site.com [NC]
RewriteRule ^(.*)$ https://new-your-site.com/$1[L,R=301,NC]
		
	

Второй:

		
RewriteCond %{HTTP_HOST} ^www.old-your-site.com$ [NC]
RewriteRule ^(.*)$ http://new-your-site.com/$1[L,R=301]
RewriteCond %{HTTP_HOST} ^old-your-site.com$ [NC]
RewriteRule ^(.*)$ http://new-your-site.com/$1[L,R=301]
		
	

В ряде случаев полезна переадресация через RewriteRule

Как перенаправлять людей с разных адресов на выбранную страницу? Используйте директива RewriteRule. Она прописывает правила перехода. Синтаксис такой:

RewriteRule Шаблон Подстановка [коды]

  • При внешнем редиректе меняется урл адреса в строке браузера — «[R=301,L]»
  • При внутреннем — не меняет урл адреса в строке браузера — «[R=301]» или «[L]RewriteRule ^dir /dir-new/$1 [R=301,L]

301-редирект для страницы с параметрами

При редиректе ссылок с GET параметрами стандартные правила в htaccess не работают. К этим правилам относят, например,

		
Redirect 301 /page.php?id=1 /page/
		
	

или:

		
RewriteRule ^page.php?id=1 /page/ [R=301,L]
		
	

Чтобы настроить редирект на страницу с другими параметрами, используйте директиву RewriteCond:

		
RewriteEngine On
RewriteCond %{QUERY_STRING} ^id=1$
RewriteRule ^(.*)$ http://mysite.com/page/? [R=301,L]
		
	

Более подробный вариант:

		
RewriteEngine On
RewriteCond %{REQUEST_URI} /page.php
RewriteCond %{QUERY_STRING} ^id=1$
RewriteRule ^(.*)$ http://mysite.com/page/? [R=301,L]
		
	

Для создания массового редиректа, то воспользуемся регулярным выражением, где (.*) выбирает любое значение:

		
RewriteCond %{QUERY_STRING} ^id=(.*)$
RewriteRule ^(.*)$ http://mysite.com/page/? [R=301,L]
		
	

Переадресация с простого url на ссылку с get-параметрами:

		
RewriteCond %{REQUEST_URI} /page.php$
RewriteRule ^(.*)$ https://mysite.com/newpage?id=1[R=301,L]
		
	

Еще один вариант:

		
RewriteCond %{QUERY_STRING} ^(?!id)
RewriteRule /page.php$ /newpage?id=1 [L,R=301,QSA]
		
	

301-редирект со страницы без заданного параметра в корень

Если адрес имеет вид: http://www.site.ru/?abc, то для перенаправления подойдет последовательность строчек:

		
RewriteCond %{QUERY_STRING} ^abc$ [NC]
RewriteRule^$ /? [R=301,L]
		
	

301-редирект для выбранного файла

Переадресация с адреса http://www.site.ru/dir/ должна идти так, чтобы страница http://www.site.ru/dir/index.php?IBLOCK_ID=1 открывалась по старому адресу. Пропишите спецсимвол $ в правиле.

		
RewriteRule^dir/$ http://www.site.ru/new-dir/ [R=301,L]
		
	

Смена страниц с html расширения на php расширение

Пропишите какой код:

		
RedirectMatch301 (.*).html$ http://www.new-site.ru$1.php
		
	

Задание типа индексной страницы

Это страница (файл), открывающаяся по умолчанию, когда пользователь делает запрос к любой директории. Например, прописав в адресной строке браузера адрес http://site.com/iPhone, откроется индекстый файл отвечающий этой директории. Если в директории iPhone нет индексной страницы, отобразится уведомление про ошибку 403.

Существуют такие типы индексных файлов: index.html, index.htm, index.php, index.phtml, index.shtml, default.htm или default.html. Чтобы задать тип индексной страницы, пропишите порядок загрузки типов файлов, лежащих в корне директории: DirectoryIndex index.html index.php index.htm index.shtml Другой пример. Если прописать в адресной строке обозревателя http://site.com/iPhone, откроется индексная страница index.html. Если нужно отобразить другую, например, iPhone.php, в .htaccess пропишите:

		
DirectoryIndex iPhone.php
		
	

Перенос картинок img на поддомен

Представьте. Вы едете один в машине. Она едет легко и быстро. А если загрузить багажник и посадить еще три человека. Будет ли такая же легкость при езде? С веб-ресурсом похожая история. Перенесите картинки на поддомен, пропишите такой код:

		
RewriteRule ^img/(.+).jpg$
http://img.domain.ru/$1.jpg [R=301,L]
		
	

Редирект с индексной страницы php на саму папку

Напишите такой код:

		
RewriteCond%{THE_REQUEST} ^[A-Z]{3,9} /index.php HTTP/
RewriteRule ^index.php$ http://www.site.ru/ [R=301,L]
		
	

Для всех индексных страниц на сайте:

		
RewriteRule ^(.*)index.php$ http://www.site.ru/$1 [R=301,L]
		
	

Переход с поддомена на основной адрес

Если вы скопируете веб-сайт с поддомена test.site.com на домен второго уровня site.com ПС будут считать их за рзные сайты. Послений даже может попасть под фильтр Яндекса или Google. Роботы ПС посчитают новый веб-ресурс копией старого. Чтобы не потерять трафик и не попасть под санкции ПС используйте переход с поддомена. Пропишите такой код:

		
RewriteCond %{HTTP_HOST} ^test.site.com$ [NC]
RewriteRule ^(.*)$ http://site.com%{REQUEST_URI} [R=301,NC,L,QSA]
		
	

Редирект для файла в разных папках

		
RewriteRule [^abc]/unique-file.html /unique-file.html[R=301,L]
		
	

Код настроит 301-редирект со директорий типа http://site.ru/***/uniqe-file.html на один файл в корне /unique-file.html. Используйте его при редактировании сайта и изменении ссылок.

Создание ЧПУ-копии динамической страницы

Если требуется создать ЧПУ-копию какой-либо динамической страницы, то это можно также реализовать с помощью .htaccess

		
RewriteRule ^testovyi/test/?$/studio/news/detail.php?ID=230354&PAGEN_2=11 [NC,L]
		
	

Код позволяет создать копию страницы с относительным адресом /studio/news/detail.php?ID=230354&PAGEN_2=11 по адресу /testovyi/test/

Настройка 403 кода ответа сервера для реф-спама (301-редирект для спама по REFERER) для списка ресурсов

Настройка позволяет отклонить спамный реферальный трафик с ресурсов по заголовку HTTP_REFERER.

		
RewriteCond %{HTTP_REFERER} ref-spam-site.ru [NC,OR]
RewriteCond %{HTTP_REFERER} another-ref-spam.ru [NC]
RewriteRule.* - [F]
		
	

Указание пути к файлу 404 ошибки с помощью .htaccess

Путь к файлу указывается с помощью следующей строчки:

		
ErrorDocument404 /404-for-me.php
		
	

Настройка редиректа для выбранных USER_AGENT’ов

Пропишите какой код:

		
RewriteCond%{HTTP_USER_AGENT}
(iPad|ipad|iphone|iPhone|ipod|iPod|android|midp|
j2me|symbian|series 60|symbos|windowsmobile|
windows ce|ppc|smartphone|blackberry|mtk|bada|
windows phone) [NC]
RewriteRule (.*) http://mobile.site.ru/ [L,R=301]
		
	

Настройка редиректа для всех роботов ПС

Представлен список их USER_AGENT’ов:

		
RewriteCond%{HTTP_USER_AGENT} !(accoona|ia_archiver|
antabot|ask jeeves| baidu|dcpbot|eltaindexer|
feedfetcher|gamespy|gigabot|googlebot |gsa-crawler|
grub-client|gulper|slurp|mihalism|msnbot|
worldindexer|ooyyo|pagebull|scooter|w3c_validator|
jigsaw|webalta|yahoofeedseeker|yahoo!slurp|
mmcrawler|yandexbot|yandeximages|yandexvideo|
yandexmedia|yandexblogs|yandexaddurl|yandexfavicons|
yandexdirect|yandexmetrika|yandexcatalog|yandexnews |
yandeximageresizer) [NC]
RewriteRule (.*) http://no-search.site.ru/ [L,R=301]
		
	

Рекомендации по работе с редиректами

Рассмотрим основные рекомендации при работе с редиректами.

Старайтесь не допускать переадресаций внутри веб-ресурса. Битые внутренние ссылки обязательно исправляйте.

Проверка правильности переадресации

Если после перенаправления не получили нужный код и сервис не показал информацию по редиректам, тогда надо перепроверить код. Используйте сервис для проверки кода ответа https://tools.discript.ru/http-code/:

Проверка правильного настроенного редиректа

Проверка правильности переадресации на tools.discript.ru

Создайте резервную копию

Перед созданием переадресации или любыми изменениями в настройках веб-сайта создайте Backup. Тогда если после внесенных изменений веб-сайт перестанет работать, вы сможет вернуть первоначальные настройки из резервной копии. Создайте его на сервере. Переименуйте, например в .htaccess-backup. Также данный файл можно загрузить на ПК.

Прописывайте правила по одному и проверяйте после каждого изменения

Если нужно настроить 3-4 переадресации, создавайте и запускайте их по одной. После создания правила посмотрите, чтобы все работало. Далее создайте новое правило. Иначе при возникновении ошибки трудно определить, какая директива ее вызвала.

Переадресация файла robots.txt

При изменении домена переход настраивается для каждой страницы и файла robots.txt на сайте. Чтобы склейка доменов в ПС прошла быстрее, не переадресуйте robots.txt на старом домене.

Генераторы .htaccess

Вы можете сгенерировать правила с помощью сервисов, а полученный результат добавить в файл .htaccess.

Алгоритм действий:

  1. Выберите редирект;
  2. Укажите дополнительные параметры;
  3. Получите готовый код. Копируйте его и добавляйте в конфигурационный файл.

Рекомендуемые сервисы:

  • Htaccess.ru;
  • Aleydasolis.com;
  • Htaccessredirect.net.

Порой при дебаге сложно отследить (отловить, найти) какой участок кода создаёт перенаправления в WordPress (сложно поймать редирект). Но если такие редиректы делаются функциями WordPress: wp_redirect() или wp_safe_redirect() — решение есть!

Ниже показано как без труда вылавливать редиректы.

При включенном дебаге, используем код:

add_filter( 'wp_redirect', 'wp_redirect_print_debug_backtrace' );

function wp_redirect_print_debug_backtrace( $location ) {

	error_log( print_r( debug_backtrace( true ), true ) );

	// или
	/*
	ob_start();
	debug_print_backtrace();
	$log = ob_get_clean();
	error_log( $log );
	*/

	return $location;
}

Ознакомьтесь с возможностями функции debug_backtrace, чтобы изменить полноту предоставляемых данных.

Также можно использовать функцию debug_print_backtrace(), но она сразу выводит данные на экран, поэтому их надо «буферить», чтобы передать в error_log().

Теперь попробуем, например, посетить страницу example.com/login/, с которой движок перенаправит нас на страницу example.com/wp-login.php. В логе мы получим следующую информацию:

Array
(
	[0] => Array
		(
			[file] => F:serverwwwwp-test.ruwp-includesclass-wp-hook.php
			[line] => 289
			[function] => wp_redirect_print_debug_backtrace
			[args] => Array
				(
					[0] => https://wp-test.ru/wp-login.php
				)

		)

	[1] => Array
		(
			[file] => F:serverwwwwp-test.ruwp-includesplugin.php
			[line] => 206
			[function] => apply_filters
			[class] => WP_Hook
			[type] => ->
			[args] => Array
				(
					[0] => https://wp-test.ru/wp-login.php
					[1] => Array
						(
							[0] => https://wp-test.ru/wp-login.php
							[1] => 302
						)

				)

		)

	[2] => Array
		(
			[file] => F:serverwwwwp-test.ruwp-includespluggable.php
			[line] => 1257
			[function] => apply_filters
			[args] => Array
				(
					[0] => wp_redirect
					[1] => https://wp-test.ru/wp-login.php
					[2] => 302
				)

		)

	[3] => Array
		(
			[file] => F:serverwwwwp-test.ruwp-includescanonical.php
			[line] => 971
			[function] => wp_redirect
			[args] => Array
				(
					[0] => https://wp-test.ru/wp-login.php
				)

		)

	[4] => Array
		(
			[file] => F:serverwwwwp-test.ruwp-includesclass-wp-hook.php
			[line] => 287
			[function] => wp_redirect_admin_locations
			[args] => Array
				(
					[0] =>
				)

		)

	[5] => Array
		(
			[file] => F:serverwwwwp-test.ruwp-includesclass-wp-hook.php
			[line] => 311
			[function] => apply_filters
			[class] => WP_Hook
			[type] => ->
			[args] => Array
				(
					[0] =>
					[1] => Array
						(
							[0] =>
						)

				)

		)

	[6] => Array
		(
			[file] => F:serverwwwwp-test.ruwp-includesplugin.php
			[line] => 478
			[function] => do_action
			[class] => WP_Hook
			[type] => ->
			[args] => Array
				(
					[0] => Array
						(
							[0] =>
						)

				)

		)

	[7] => Array
		(
			[file] => F:serverwwwwp-test.ruwp-includestemplate-loader.php
			[line] => 13
			[function] => do_action
			[args] => Array
				(
					[0] => template_redirect
				)

		)

	[8] => Array
		(
			[file] => F:serverwwwwp-test.ruwp-blog-header.php
			[line] => 19
			[args] => Array
				(
					[0] => F:serverwwwwp-test.ruwp-includestemplate-loader.php
				)

			[function] => require_once
		)

	[9] => Array
		(
			[file] => F:serverwwwwp-test.ruindex.php
			[line] => 17
			[args] => Array
				(
					[0] => F:serverwwwwp-test.ruwp-blog-header.php
				)

			[function] => require
		)

)

Благодаря этой отладочной информации, мы определили, что за перенаправление ответствен хук:

add_action( 'template_redirect', 'wp_redirect_admin_locations', 1000 );

Он навешивается в файле default-filters.php и запускает функцию wp_redirect_admin_locations(), которая и создает само перенаправление.

Понравилась статья? Поделить с друзьями:
  • Как составить трудовой договор с работником до 18 лет
  • Как найти расходы на заработную плату
  • Error 013 no entry point no public functions как исправить
  • Как найти где находится смартфон
  • Как найти несохраненный документ ворд 2007