#regex #wordpress #apache #.htaccess #redirect
Вопрос:
Я хочу перенаправить каждую ссылку со строкой запроса на определенный адрес, добавив строку. У меня есть следующее в моем WordPress .htaccess
:
RewriteEngine On RewriteCond %{QUERY_STRING} catid=([0-9] ) [NC] RewriteRule (.*) catid%1? [R=301,L]
Когда пользователь нажимает example.com/?catid=10
, он успешно перенаправляется example.com/catid10
, чего я и хочу.
Однако, когда они заходят в каталог глубже ( example.com/category/?catid=10
), они не перенаправляются example.com/category/catid10
.
Я читал руководства, но не могу найти ответ.
Редактировать
Если это полезно, это то, что WordPress определил в моем htaccess:
RewriteEngine On RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] RewriteBase / RewriteRule ^index.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L]
Ответ №1:
Предоставление RewriteBase /
уже определено (что обычно происходит с WordPress и должно быть, если ваш существующий редирект работает), тогда вы можете сделать это следующим образом с помощью одного правила:
RewriteCond %{QUERY_STRING} (?:^|amp;)catid=(d ) [NC] RewriteRule (.*?)/?$ $1/catid%1 [QSD,R=301,L]
Группа захвата (.*?)
не является жадной, поэтому не использует необязательную конечную косую черту, которая следует за ней.
Запросы на корневой каталог документа не требуются RewriteBase
, но все «более глубокие» URL-адреса требуются, поскольку в противном случае результирующая строка подстановки будет относительным URL-адресом.
Префикс без захвата (?:^|amp;)
на CondPattern гарантирует, что он соответствует только имени параметра URL catid
, а не foocatid
и т. Д.
Комментарии:
1. Спасибо. Да,
RewriteBase /
определено. Я попробовал это, но все равно не перенаправляет.2. @vl4der Вам нужно поместить это в начало
.htaccess
файла, перед существующими директивами WordPress.3. Теперь это работает! Огромное спасибо.
Ответ №2:
Вам просто нужно добавить захваченную группу из (.*)
в вашу цель перенаправления с помощью $1
. Я бы разбил это на несколько правил, чтобы у вас не было повторяющихся косых черт. Вместо того, чтобы заканчивать ваши цели перезаписи вопросительным знаком, я бы добавил QSD
в правило флаг (отбросить строку запроса). Я бы также добавил, что начинается с ( ^
) и заканчивается ( $
), чтобы переписать правило, чтобы вы всегда соответствовали всему. Мне также нравится начинать свои правила с необязательной косой черты ( /?
), чтобы правила можно было использовать как в .htaccess, так и в apache conf.
RewriteEngine On # Home URL with catid query string RewriteCond %{QUERY_STRING} catid=([0-9] ) [NC] RewriteRule ^/?$ /catid%1 [R=301,L,QSD] # Deep URL ending in slash with a catid query string RewriteCond %{QUERY_STRING} catid=([0-9] ) [NC] RewriteRule ^/?(.*)/$ /$1/catid%1 [R=301,L,QSD] # Deep URL not ending in slash with a cadid query string RewriteCond %{QUERY_STRING} catid=([0-9] ) [NC] RewriteRule ^/?(.*)$ /$1/catid%1 [R=301,L,QSD]