Строка запроса не перенаправляется в каталоги более глубокого уровня

#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]