Делаем Redirect и Rewrite в строке со знаком вопроса
Очень часто возникает такая ситуация, что страница сайта "переехала" куда-либо и появляется необходимость осуществить редирект с адреса старой страницы на адрес новой страницы. Для этого очень использовать файл .htaccess, который расположен в корне вашего сайта (если у вас на сервере имеется Apache).
Как делается обычный редирект в htaccess?
Рассмотри пару простых примеров - более сложные случаи представлены в Интернете.
Пример 1
Redirect 301 / http://www.my_site.com/new.html
В этом примере Redirect 301 - это инструкция, говорящая что страница перемещена
/ - означает, что все с верхнего уровня сайта, включая все подкаталоги, будет переадресовано
http://www.my_site.com/new.html - новая страница или сайт (обязательно поставьте "/", если переадресация идет на сайт).
Пример 2
Redirect 301 /old_directory/old_page.html http://www.my_site.com/new.html
В этом примере показано, как переадресовать только одну страницу, сохранив при этом показатель PR (PageRank) старой страницы.
Что делать с редиректами в htaccess, если в строке знак вопроса?
Рассмотрим такой случай. Есть сайт, у которого страницы имеют вид my_site.ru/page.php?id=3. Это не самая красивая разновидность ссылок. Очень часто для больше красоты делают RewriteRule в htaccess, чтобы придать ссылкам красивый внешний вид. Для этого пользуются конструкциейRewriteRule ^page_number_3\.html page.php?_id=3 [L]
Однако потом можно столкнуться с проблемой - если вы сделали такое ЧПУ (Человеко Понятные Урлы от англ. Friendly URL) не сразу, а через какое-то время после создания сайта, может получиться, что уже имеются ссылки на страницу с адресом my_site.ru/old_page.php?id=3 а для поисковиков эта страница будет копией страницы my_site.ru/page_number_3.html . В таком случае нужно сделать редирект с my_site.ru/old_page.php?id=3 на my_site.ru/page_number_3.html . Главное, чтобы не получился цикл
Вот как это делается для одной страницы:
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{QUERY_STRING} id=3
RewriteRule ^old_page\.php$ http://%{HTTP_HOST}/page_number_3.html? [R=301,L]
Не получается в htaccess?
Если не получается сделать редирект с помощью htaccess, его можно сделать либо с помощью html, либо с помощью php:
header($_SERVER['SERVER_PROTOCOL'].' 301 Moved Permanently');
header('Location: http://new_site.ru/new_page.html');
Есть ещё один вариант - метатег canonical, сообщающий поисковику о том, где оригинал страницы, однако редиректа для юзера в этот момент не происходит!