Я много проверял, на свой вопрос. Есть некоторые близкие, но ни один из них не решит мою проблему.
Мне нужно перенаправить ВСЕ URL-адреса, которые заканчиваются на это навсегда. :
?mode=list
И
?mode=grid
без (удалите вопросительный знак и то, что стоит после него)
Пример:
example.com/random-url-here?mode=grid redirect to example.com/random-url-here
И
example.com/whatever-url-here?mode=list redirect to example.com/random-url-here
Я пробовал это:
RewriteEngine on
RewriteRule (.*)$^mode=list $1
RewriteRule (.*)$^mode=grid $1
и это
RewriteEngine on
RewriteRule (.*)$^mode=list $1 [L,R=301]
RewriteRule (.*)$^mode=grid $1 [L,R=301]
Но это не так работает. Ясно, я не понимаю, как это работает. Пожалуйста, помогите.
Спасибо
example.com/random-url-here?mode=grid
Часть URL после первого ?
(т.е.mode=grid
в этом примере) называется строкой запроса.
RewriteRule (.*)$^mode=list $1 [L,R=301]
Директива RewriteRule
принимает до 3 аргументов:
RewriteRule pattern substitution [flags]
шаблон (первый аргумент) директивы RewriteRule
является регулярным выражением (regex) который соответствует только запрошенному URL-пути, что, в частности, исключает строку запроса. Поэтому вы не можете сопоставить строку запроса с помощью директивы RewriteRule
.
Чтобы сопоставить строку запроса, вам нужно использовать дополнительную директиву RewriteCond
(условие) и свериться с серверной переменной QUERY_STRING
. Директивы RewriteCond
применяют условия к следующей директиве RewriteRule
.
Однако регулярное выражение (.*)$^mode=list
(кроме попытки сопоставить строку запроса) никогда не будет соответствовать в этом контексте. $
утверждает конец строки, а ^
утверждает начало строки, поэтому это всегда будет ошибкой.
В приведенном выше примере обратная ссылка $1
(в строке подстановки) пытается сопоставить URL-путь. Однако этот URL-путь (в контексте каталога, т.е. .htaccess
) не начинается с косой черты (т.е. это относительный), поэтому приведет к искаженному перенаправлению, если только у вас нет директивы RewriteBase
, определенной в другом месте вашего .htaccess
. Строка замены relative рассматривается как путь файловой системы относительно каталога, содержащего файл .htaccess
.
Если вы опустите флаг R
(redirect
) в этом контексте (как в вашем первом примере), тогда он попытается внутренне переписать запрос (а не перенаправить извне), поэтому видимый URL-адрес не изменится.
Вместо этого попробуйте следующее, в верхней части корневого файла .htaccess
:
RewriteEngine On
RewriteCond %{QUERY_STRING} ^mode=(list|grid)$
RewriteRule (.*) /$1 [QSD,R=302,L]
Приведенные выше состояния... для всех URL-адресов (.*)
, у которых есть запрос строка из mode=list
или mode=grid
(точно), затем перенаправление на тот же URL-путь и отбрасывание строки запроса (QSD
— отбрасывание строки запроса) . QSD
является новым для Apache 2.4 (который, я полагаю, вы используете). Если вы опустите флаг QSD
, вы получите цикл перенаправления (поскольку строка запроса будет повторно добавлена к перенаправленному URL-адресу).
Обратите внимание, что приведенное выше соответствует строке запроса точно (как в ваших примерах). Если в строке запроса есть какие-либо другие параметры URL-адреса или регистр отличается, он не будет соответствовать.
Обратите внимание, что это переадресация 302 (временная). Измените его на 301 (постоянный) - если это намерение - только после того, как вы подтвердите, что он работает нормально. 301 постоянно кэшируются браузером, поэтому тестирование может быть проблематичным.
Ссылка: