htaccess перенаправляет все URL-адреса с параметром вопросительного знака на без

Я много проверял, на свой вопрос. Есть некоторые близкие, но ни один из них не решит мою проблему.

Мне нужно перенаправить ВСЕ 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
задан 3 December 2020 в 00:56
1 ответ
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 постоянно кэшируются браузером, поэтому тестирование может быть проблематичным.

Ссылка:

1
ответ дан 3 December 2020 в 17:45

Теги

Похожие вопросы