Htaccess - -удаление параметров из URL

Мне нужно удалить один параметр из url с помощью htaccess

от

http://example.com/page/detail/page.php?name=franco&age=50

до

http://example.com/page/detail/page.php?age=50

Я использую этот htaccess:

RewriteEngine on
RewriteCond %{QUERY_STRING} ^(.*)&?name=[^&]+&?(.*)$ [NC]
RewriteRule ^/?(.*)$ /$1?%1%2%3 [R=301,L]

Но у меня такой результат, я потерял путь к странице:

http://example.com/page.php?eta=57
1
задан 15 January 2019 в 11:05
1 ответ

файл находится в той же папке страницы.

Это "проблема". В файлах .htaccess для каждого каталога шаблон RewriteRule (например, ^ /? (. *) $ ) совпадает с URL-путем за вычетом префикса каталога , а не полного пути URL. Другими словами, захваченный URL-путь - это просто page.php , а не page / detail / page.php , как вы ожидаете.

Ваши директивы написаны так, как если бы этот .htaccess файл находится в корне документа вашего сайта, а не в подкаталоге.

Поскольку вы не изменяете URL-путь, вы можете просто использовать серверную переменную REQUEST_URI вместо строка подстановки , которая содержит полный URL-путь (включая префикс косой черты):

RewriteRule ^ %{REQUEST_URI}?%1%2 [R=302,L]

Поскольку вы сопоставляете все URL-пути и вам не нужно ничего захватывать, вы можете упростить RewriteRule шаблон с ^ /? (. *) $ на ^ . Обратная ссылка % 3 в вашем примере излишняя (у вас есть только 2 захваченные группы в предыдущем CondPattern ).

Обратите внимание, что это 302 (временное) перенаправление. Измените это значение на 301 (постоянный), только если вы уверены, что все работает нормально - чтобы избежать проблем с кешированием браузера.

Вам необходимо очистить кеш браузера перед тестированием.

Регулярное выражение RewriteCond может также можно упростить:

RewriteCond %{QUERY_STRING} (.*)name=[^&]+&?(.*) [NC]

Поскольку первый & был необязательным (например, &? ), предыдущий подшаблон (. *) все равно будет использовать его ( что требуется). Итак, первый &? можно просто удалить. Якоря строки ^ и $ также не требуются (по умолчанию регулярное выражение жадное и будет использовать всю строку независимо).

Флаг NC строго требуется только в том случае, если имя может иметь смешанный регистр, в противном случае этот флаг должен быть удален.

имя параметра всегда является первым параметром

Если это так, то вы не нужен первый захваченный подшаблон и может привязать name = к началу строки запроса. Теперь есть только одна обратная ссылка (на строку после параметра name = URL).

Итак, ваши директивы теперь выглядят так:

RewriteEngine On
RewriteCond %{QUERY_STRING} ^name=[^&]+&?(.*) [NC]
RewriteRule ^ %{REQUEST_URI}?%1 [R=302,L]
0
ответ дан 4 December 2019 в 03:20

Теги

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