Я много перепробовал, чтобы найти ответ на свой вопрос. Некоторые из них близки, но ни один из них не решил бы мою проблему.
Мне нужно навсегда перенаправить ВСЕ 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]
Но это не работает. Очевидно, я не понимаю, как это работает. Пожалуйста, помогите.
Спасибо
решение1
example.com/random-url-here?mode=grid
Часть URL после первой ?
(т.е. mode=grid
в этом примере) называетсяСтрока запроса.
RewriteRule (.*)$^mode=list $1 [L,R=301]
Директива RewriteRule
принимает до 3 аргументов:
RewriteRule pattern substitution [flags]
Theшаблон(первый аргумент) директивы RewriteRule
— это регулярное выражение (regex), которое соответствует запрошенномутолько URL-путь, что, в частности, исключает строку запроса. Поэтому вы не можете сопоставить строку запроса с помощью RewriteRule
директивы.
Чтобы сопоставить строку запроса, вам необходимо использовать дополнительную RewriteCond
(условную) директиву и проверить ее по QUERY_STRING
переменной сервера. RewriteCond
Применяются директивыусловияк RewriteRule
следующей директиве.
Однако регулярное выражение (.*)$^mode=list
(кроме попытки сопоставить строку запроса) будетникогдав этом контексте match. $
утверждает конец строки и ^
утверждает начало строки, поэтому это всегда приведет к ошибке.
В приведенном выше примере $1
обратная ссылка (встрока замены) пытается сопоставить URL-путь. Однако этот URL-путь (вкаталогконтекст, т.е. .htaccess
) не начинается со слеша (т.е. этородственник), поэтому это приведет к неправильному перенаправлению, если только у вас также нет RewriteBase
директивы, определенной в другом месте вашего .htaccess
файла.родственникСтрока подстановки рассматривается как путь в файловой системе относительно каталога, содержащего файл .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
- Query String Discard). Это QSD
новшество Apache 2.4 (который, как я предполагаю, вы используете). Если вы опустите флаг, QSD
то получите цикл перенаправления (так как строка запроса будет повторно добавлена к перенаправленному URL-адресу).
Обратите внимание, что приведенное выше соответствует строке запросаточно(как в ваших примерах). Если в строке запроса есть какие-либо другие параметры URL или регистр отличается, то совпадение не будет выполнено.
Обратите внимание, что это 302 (временный) редирект. Измените его на 301 (постоянный) — если это и есть намерение — только после того, как вы убедитесь, что все работает нормально. 301 постоянно кэшируются браузером, поэтому могут затруднить тестирование.
Ссылка: