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

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

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 постоянно кэшируются браузером, поэтому могут затруднить тестирование.

Ссылка:

Связанный контент