Редирект 301: URL с get-параметрами
Когда дело доходит до редиректа ссылок с get-параметрами, то многие веб-мастера обнаруживают, что стандартные правила в htaccess для них не работают:
Redirect 301 /page.php?id=1 /page/
Еще один не рабочий вариант:
RewriteRule ^page.php?id=1 /page/ [R=301,L]
Правильным решением будет использование директивы RewriteCond :
RewriteEngine On
RewriteCond % ^id=1$
RewriteRule ^(.*)$ http://mysite.com/page/? [R=301,L]
RewriteEngine On
RewriteCond % /page.php
RewriteCond % ^id=1$
RewriteRule ^(.*)$ http://mysite.com/page/? [R=301,L]
Если нужно сделать массовый редирект, то воспользуемся регулярным выражением, где (.*) выбирает любое значение:
RewriteCond % ^id=(.*)$
RewriteRule ^(.*)$ http://mysite.com/page/? [R=301,L]
Для того, чтобы сделать переадресацию с обычного url на ссылку с get-параметрами, пишем:
RewriteCond % /page.php$
RewriteRule ^(.*)$ https://mysite.com/newpage?id=1 [R=301,L]
RewriteCond % ^(?!id)
RewriteRule /page.php$ /newpage?id=1 [L,R=301,QSA]
Редирект средствами php
Бывают ситуации, когда удобнее воспользоваться редиректом на php:
В случае, если нужно сделать переадресацию нескольких url на один адрес, воспользуемся таким кодом:
‘/page.php?id=1’,
‘/page.php?id=2’,
…
‘/page.php?id=100500’
))) header(«Location: /page/»,TRUE,301);
exit();
>
?>
Этим способом можно делать редирект для любых ссылок, кроме кириллических.
Таким же образом можно сделать переадресацию с помощью регулярного выражения:
Если нужно исключить любые get-параметры на главной странице:
Редирект в nginx
Недавно клиенту потребовалось настроить переадресацию c кириллического адреса на обычный с get-параметрами. При этом apache на сервере не использовался. В таком случае нам поможет nginx:
location =/моя-страница rewrite ^ /page.php?id=1 permanent;
>
Для переадресации со страницы с get-параметрами используем следующий код:
if ($id = 1) rewrite (.*)$ $uri? permanent;
>
После чего нужно перечитать конфигурацию, выполнив service nginx reload или перезапустить nginx — service nginx restart .
Как сделать редирект PHP
На страницах сайтов постоянно что-то добавляется, удаляется и обновляется, чтобы в поисковиках была только актуальная информация и нужные страницы не выпадали из поиска применяются редиректы. Также редиректы используются после отправки форм чтобы не было возможности отправить форму несколько раз.
- 301 – текущая страница удалена на всегда, заменой старой считать новый URL.
- 302 – текущая страница временно не доступна, заменой считать пока новый URL.
- 303 – используется после отправки формы методом POST (подробнее Post/Redirect/Get — PRG).
Итак, сделать 301-й редирект можно так:
header('Location: https://example.com', true, 301); exit();
Но функция header() не сработает если до ее вызова в браузер уже выводился какой-то контент и вызовет ошибку:
Warning: Cannot modify header information — headers already sent by…
Исправить ее можно использовав буферизацию вывода добавив в самое начало скрипта ob_start() ;
Также можно подстраховаться добавив JS-редирект и ссылку если функция header() не сработает.
Упростить использование кода можно выделив его в отдельную функцию:
function redirect($url, $code = 301) < header('Location: ' . $url, true, $code); echo ""; echo 'Перенаправление… Перейдите по ссылке.'; exit(); > /* В index.php */ if ($_SERVER['REQUEST_URI'] == '/url-old') < redirect('https://example.com/url-new'); >
$urls = array( array('/url-old-1', 'https://example.com/url-new-1'), array('/url-old-2', 'https://example.com/url-new-2'), array('/url-old-3', 'https://example.com/url-new-3'), ); foreach ($urls as $row) < if ($_SERVER['REQUEST_URI'] == $row[0]) < redirect($row[1]); >>
Как сделать 301 редирект с Url с get параметрами на url без параметров, но содержащего значения из них?
Все редиректы должны выполняться на хуке template_redirect с помощью функции wp_redirect() или wp_safe_redirect() . Разбираете ссылку, проверяете необходимые условия редиректа и собираете новую ссылку. Вот шаблон:
add_action( 'template_redirect', 'custom_template_redirect' ); function custom_template_redirect() < if ( $condition ) < wp_redirect( home_url( '/' ) ); exit(); >>
GET параметр не является частью урла и не попадает в RewriteRule так что работать с ним можно только через %
RewriteCond — это если, они складываются до RewriteRule
RewriteCond % (?:^|&)id\=000001(?:$|&) RewriteCond % (?:^|&)userid\=22222222222(?:$|&) RewriteRule ^Orders/Order$ /Orders/Order_id_000001_userid_22222222222? [L,R=301]
Cоответственно для всех вариантов
RewriteCond % (?:^|&)id\=(.+)(?:$|&) RewriteCond % (?:^|&)userid\=(.+)(?:$|&) RewriteRule ^Orders/Order$ /Orders/Order_id_%1_userid_%2? [L,R=301]
где %1 это группа из RewriteCond %2 соответственно
(?: — этот знак анилирует этут группу дабы она не мешала
Спасибо большое! Но у меня не получается
https://loc.mysite.com/Orders/Order_id_000001_userid_11111111111 https://loc.mysite.com/Orders/Order_id_000002_userid_22222222222
https://loc.mysite.com/Orders/Order?id=000001&userid=11111111111
https://loc.mysite.com/Orders/Order_id_000001_userid_11111111111
https://loc.mysite.com/Orders/Order?id=000002&userid=22222222222
https://loc.mysite.com/Orders/Order_id_000002_userid_22222222222
Однако, параметры ?id=000001&userid=11111111111 и ?id=000002&userid=22222222222
перенаправляют только на одну страницу
https://loc.mysite.com/Orders/Order_id_000001_userid_11111111111
RewriteCond % .*id\=(9+)\&userid\=(4+).* RewriteRule ^Orders/Order/$ /Orders/Order_id_%1_userid_%2? [L,R=301]
🙁 не могу понять почему у меня не работает, все время редиректит только к одной странице (самой первой созданной).
Думала, может как-то настройки постоянных ссылок влияют, перепробовала все варианты не помогло.
Установила плагин для редактирования .htaccess, тоже ничего. Кэш чистила.
Может дело в вордпрессе? Или может то, что это посты, а не страницы влияет?
Вот так выглядит .htaccess
RewriteEngine On RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond % !-f RewriteCond % !-d RewriteRule . /index.php [L] RewriteCond % .*id\=(5+)\&userid\=(1+).* RewriteRule ^Orders/Order/$ /Orders/Order_id_%1_userid_%2? [L,R=301]
Я уже в отчаянии.
Вам все равно спасибо огромное!
RewriteEngine On RewriteCond % .*id\=(6+)\&userid\=(9+).* RewriteRule ^Orders/Order/$ /Orders/Order_id_%1_userid_%2? [L,R=301] RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond % !-f RewriteCond % !-d RewriteRule . /index.php [L]
Видимо в вордпрессе не работает все таки.
Я думала что код работает, но не так как надо, а оказывается вообще ничего не происходит. Что с кодом, что без — результат один. Пока пришлось установить плагин и вручную добавлять редирект на каждую страницу. Кстати, через плагин тоже код не работает. ((((
Уже не знаю в какую сторону копать.
Как сделать редирект PHP
На страницах сайтов постоянно что-то добавляется, удаляется и обновляется, чтобы в поисковиках была только актуальная информация и нужные страницы не выпадали из поиска применяются редиректы. Также редиректы используются после отправки форм чтобы не было возможности отправить форму несколько раз.
- 301 – текущая страница удалена на всегда, заменой старой считать новый URL.
- 302 – текущая страница временно не доступна, заменой считать пока новый URL.
- 303 – используется после отправки формы методом POST (подробнее Post/Redirect/Get — PRG).
Итак, сделать 301-й редирект можно так:
header('Location: https://example.com', true, 301); exit();
Но функция header() не сработает если до ее вызова в браузер уже выводился какой-то контент и вызовет ошибку:
Warning: Cannot modify header information — headers already sent by…
Исправить ее можно использовав буферизацию вывода добавив в самое начало скрипта ob_start() ;
Также можно подстраховаться добавив JS-редирект и ссылку если функция header() не сработает.
Упростить использование кода можно выделив его в отдельную функцию:
function redirect($url, $code = 301) < header('Location: ' . $url, true, $code); echo ""; echo 'Перенаправление… Перейдите по ссылке.'; exit(); > /* В index.php */ if ($_SERVER['REQUEST_URI'] == '/url-old') < redirect('https://example.com/url-new'); >
$urls = array( array('/url-old-1', 'https://example.com/url-new-1'), array('/url-old-2', 'https://example.com/url-new-2'), array('/url-old-3', 'https://example.com/url-new-3'), ); foreach ($urls as $row) < if ($_SERVER['REQUEST_URI'] == $row[0]) < redirect($row[1]); >>