Правило перезаписи для URL с запросом не работает

Я написал следующее правило перезаписи:

<IfModule mod_rewrite.c>
RewriteCond %{QUERY_STRING} rp=\/knowledgebase\/.*
RewriteRule ^\/customer\/index.php /knowledgebase/ [R=301,L]
RewriteRule ^\/customer\/knowledgebase\.php$ /knowledgebase/ [R=301,L,QSA]
</IfModule>

Чтобы перенаправить URL, такой как

https://www.example.com/customer/index.php?rp=/knowledgebase/5/DataNumen-Excel-Repair на https://www.example.com/knowledgebase/

И перенаправить URL, такой как

https://www.example.com/customer/knowledgebase.php на https://www.example.com/knowledgebase/

Но оба не работают. Почему?

Обновление

Я попытался поместить коды MrWhite из /.htaccess в /customer/.htaccess и сделать некоторые незначительные изменения, чтобы принять изменения, как показано ниже:

RewriteCond %{QUERY_STRING} rp=/knowledgebase/
RewriteRule ^index\.php$ https://www.example.com/knowledgebase/ [QSD,R=301,L,NC]

RewriteRule ^knowledgebase\.php$ https://www.example.com/knowledgebase/ [R=301,L,NC]

Теперь редирект работает. Однако, он работает только для случаев типа:

https://www.example.com/customer/index.php?rp=/knowledgebase/9/DataNumen-PDF-Repair

но для случаев типа

https://www.example.com/customer/index.php?a=b&c=d&rp=/knowledgebase/9/DataNumen-PDF-Repair

Он не работает. Даже после того, как я изменил ^rp= на rp в RewriteCond.

1
задан 21 August 2021 в 22:53
1 ответ

RewriteRule ^/customer/index.php /knowledgebase/ [R=301,L]

В .htaccess URL-путь соответствует шаблону RewriteRule (т. е. ^\/customer\/index.php) не начинается с косой черты, поэтому никогда не совпадет. Совпадающий URL-путь относится к каталогу , который содержит файл .htaccess (без префикса косой черты). (В отличие от использования в контексте сервера, когда совпадающий URL-путь представляет собой URL-путь относительно корня документа, начинающийся с косой черты.)

Вам также потребуется . ]QSD в первом правиле для отбрасывания строки запроса в исходном запросе, в противном случае она передается как есть.

Незначительное замечание... в регулярном выражении Apache нет необходимости использовать обратную косую черту, так как пробелы являются разделителем аргументов, а косая черта не имеет особого значения в других регулярных выражениях.

Вместо этого попробуйте следующее:

RewriteEngine On

RewriteCond %{QUERY_STRING} ^rp=/knowledgebase/
RewriteRule ^customer/index\.php$ /knowledgebase/ [QSD,R=301,L]

RewriteRule ^customer/knowledgebase\.php$ /knowledgebase/ [R=301,L]

Я привязал строку запроса к условию, чтобы она соответствовала rp=... в начале строки запроса, как в вашем пример. .* в конце регулярного выражения не требуется.

Флаг QSA не требуется во втором правиле, поскольку строка запроса передается по умолчанию. Флаг QSA потребуется только в том случае, если вам нужно объединить исходную строку запроса в запросе с новой строкой запроса, которую вы добавили в замену.

Оболочка не требуется, если только эти директивы не являются необязательными и предназначены для использования на нескольких серверах, где mod_rewrite может быть недоступен. См. этот вопрос в стеке веб-мастеров: https://webmasters.stackexchange.com/questions/112600/is-checking-for-mod-write-really-necessary

Сначала следует протестировать с 302 (временно) перенаправляет, чтобы избежать потенциальных проблем с кэшированием.


ОБНОВЛЕНИЕ: для простоты я поместил правила перезаписи в файл .htaccess в папке /customer вместо /. Я обновил свой пост соответственно.

В этом случае вам потребуется удалить префикс customer/ в каждом из шаблонов RewriteRule , как вы сделали в обновленном вопросе.

Если параметр URL-адреса rp должен соответствовать любому месту в строке запроса, вам следует изменить CondPattern на (^|&)rp=/knowledgebase/ , а не просто удалить префикс ^. Удалив префикс ^, вы можете слишком много сопоставить, например. abcrp=/knowledgebase/... также будет соответствовать, хотя на самом деле это может быть проблемой, а может и не быть.

В противном случае эти обновленные директивы выглядят нормально, в зависимости от любых других конфликтов, которые могут существовать с другими директивами. Кэширование также может быть проблемой, особенно если вы используете CDN.

1
ответ дан 21 August 2021 в 23:29

Теги

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