Mod_rewrite: удалить строку запроса из URL?
Я пытаюсь сделать следующее перенаправление (301), используя .htaccess
*? page = 1 перенаправляет на *
(где * - подстановочный знак).
В принципе, я просто хочу, чтобы кто-либо не обращался к странице с? page = 1 в конце URL-адреса и вместо этого направлял их на тот же URL-адрес минус ?page=1
.
Есть ли быстрый способ сделать это?
Ответы
Ответ 1
Это должно сделать это:
RewriteEngine On
RewriteCond %{QUERY_STRING} ^page=1$
RewriteRule (.*) $1? [R=permanent]
Строка за строкой:
- Вы включаете функции перезаписи.
- В качестве условия ( "if statement" ) указывается, что строка запроса должна быть точно
page=1
для следующих правил.
- Затем вы указываете правило, в котором говорится о замене всего пути (. *) самим ($ 1), но сделайте строку запроса пустой (?) и сделайте результат постоянной переадресацией (301).
Если вы хотите, чтобы перенаправление было временным (302), вы можете просто удалить часть =permanent
. Moved Temporarily является значением по умолчанию для флага R
.
Ответ 2
Вы также можете использовать флаг QSD (Query String Disard) для перенаправления куда-либо без передачи строки запроса.
Ответ 3
Если вы находитесь на 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
Для удаления всей строки запроса это будет достаточно:
RewriteRule ^(.*) http://domain.com/$1? [R=301,L]