Рейтинг:1

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

флаг cn

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

<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
флаг kz

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

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

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

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

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

RewriteEngine включен

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

Правило перезаписи ^клиент/база знаний\.php$ /база знаний/ [R=301,L]

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

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

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

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


ОБНОВИТЬ: чтобы упростить задачу, я поместил правила перезаписи в .htaccess файл под /покупатель вместо /. Я обновил свой пост соответственно.

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

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

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

alancc avatar
флаг cn
Извините, но это все еще не работает. Большое тебе спасибо.
флаг kz
@alancc Что именно вы подразумеваете под «не работает»? Вы получаете ошибку? Неверный редирект? Ничего такого? Где находится ваш файл `.htaccess`? Есть ли у вас другие директивы? Любые другие файлы `.htaccess`?
alancc avatar
флаг cn
@MrWrite, большое спасибо. «Не работает» означает, что когда я ввожу URL-адрес, такой как https://www.example.com/customer/index.php?rp=/knowledgebase/9/DataNumen-PDF-Repair, ничего не происходит.Я проверяю код ответа, и он показывает 200. Я предполагаю, что это может быть связано с несколькими файлами .htaccess, поэтому, чтобы упростить задачу, я поместил правила перезаписи в файл .htaccess в /customer вместо /. Я обновил свой пост соответственно.
флаг kz
@alancc Директивы, написанные в моем ответе, предназначены для корневого файла `.htaccess`. Если вы поместите их в подкаталог `/customer`, вам нужно будет изменить их, как вы сделали в своем обновленном вопросе. Директивы в вашем обновленном вопросе выглядят нормально (префикс `^` был удален, чтобы соответствовать второму URL-адресу, хотя теперь это, возможно, слишком много совпадает). Однако есть ли у вас какие-либо другие директивы в файле `/customer/.htaccess`? Любые внешние перенаправления, подобные этому, должны идти вверху. Несколько файлов `.htaccess` могут быть проблематичными. Вы вообще используете rewrite _inheritance_?
alancc avatar
флаг cn
Большое тебе спасибо. Я дважды проверяю /customer/.htaccess, после моего правила перезаписи есть AddHandler, который автоматически генерируется cPanel. И это последнее утверждение в .htaccess. Фактический URL-адрес: https://www.datanumen.com/customer/index.php?a=b&c=d&rp=/knowledgebase/9/DataNumen-PDF-Repair, хотя теперь Cloudflare включен, я пробовал, когда он отключен и тоже не работает.
флаг kz
@alancc Я вижу, что теперь URL-адрес перенаправляется, как и предполагалось. Что было сделано для решения этой проблемы? Это была проблема с кэшированием? «AddHandler, который генерируется cPanel автоматически» — cPanel не должен редактировать файл `.htaccess` в подкаталоге? `AddHandler` обычно находится только в корневом файле `.htaccess`. (?)
alancc avatar
флаг cn
Я думаю, это связано с кэшем Cloudflare. Хотя я приостанавливаю Cloudflare на своем сайте во время тестирования, кеш или что-то еще может сделать вывод. Теперь срок действия кеша истек. Да, обычно Addhandler должен быть для root .htaccess.Однако в моем случае клиент использует WHMCS, который обычно не поддерживает последнюю версию PHP, поэтому мне нужно установить другую версию в этом подкаталоге. Большое спасибо, что указали на это.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.