Мне нужно удалить один параметр из 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
файл находится в той же папке страницы.
Это "проблема". В файлах .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]