mod_rewrite: удалить строку запроса из URL? - PullRequest
27 голосов
/ 11 августа 2010

Я пытаюсь сделать следующее перенаправление (301), используя .htaccess

*? Страница = 1 перенаправляет на *

(где * подстановочный знак).

По сути, я просто хочу запретить кому-либо доступ к странице с? Page = 1 в конце URL-адреса, и вместо этого направить их на тот же URL-адрес минус ?page=1.

Есть ли быстрый способ сделать это?

Ответы [ 4 ]

41 голосов
/ 11 августа 2010

Это должно сделать это:

RewriteEngine    On
RewriteCond      %{QUERY_STRING}    ^page=1$
RewriteRule      (.*)               $1?     [R=permanent]

Строка за строкой:

  1. Вы включаете функцию перезаписи.
  2. Вы указываете как условие ("if оператор "), что строка запроса должна быть точно page=1 для применения следующих правил.
  3. Затем вы указываете правило, которое говорит, что нужно заменить весь путь (. *) на себя ($ 1), носделайте строку запроса пустой (?) и сделайте результат постоянным перенаправлением (301).

Если вы хотите, чтобы перенаправление было временным (302), вы можете просто удалить часть =permanent,Перемещено Временно - значение по умолчанию для флага R.

20 голосов
/ 01 апреля 2014

Вы также можете использовать флаг QSD (Query String Discard) для перенаправления куда-либо без передачи строки запроса.

8 голосов
/ 21 марта 2016

Если вы используете Apache 2.4, вы можете просто использовать QSD (флаг сброса строки запроса), чтобы отбросить определенные строки запроса из целевого URL.

Вот пример для пользователей Apache 2.4:

Старый URL: - / foo / bar /? Page = 1

новый URL: - / foo / bar /

Htaccess код:

 RewriteEngine on

 RewriteCond %{THE_REQUEST} \?page=1\sHTTP [NC]
RewriteRule ^ %{REQUEST_URI} [L,R,QSD]

Приведенное выше правило перенаправит любой URI с ? Page = 1 , чтобы удалить строки запроса. Этот пример вернет ошибку 500 в версиях Apache ниже 2.4, так как они не поддерживают QSD.

В более низких версиях Apache вы можете использовать пустой знак вопроса ? в конце целевого URL для удаления строк запроса.

Пример:

 RewriteEngine on

 RewriteCond %{THE_REQUEST} \?page=1\sHTTP [NC]
RewriteRule ^ %{REQUEST_URI}? [L,R]

Пример выше работает почти на всех версиях apache.

(надеюсь, это поможет!)

4 голосов
/ 13 ноября 2014

Для удаления всей строки запроса этого будет достаточно:

RewriteRule ^(.*) http://domain.com/$1? [R=301,L]
...