Я написал следующее правило перезаписи:
<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.
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.