Назад | Перейти на главную страницу

Случай Apache Нечувствительный mod_rewrite для одного правила

Я использую mod_rewrite для URL-адресов, удобных для поисковых систем. У меня есть эта строка, которая отлично работает:

RewriteRule ^Pay ./pay.php [L] #Pay

но я бы также хотел найти совпадение, если посетитель вводит http://example.com/pay (обратите внимание на строчные буквы). Я пробовал использовать NC но я получаю ошибку 500. Я попытался сделать 2 отдельных правила: один верхний регистр и один нижний регистр, но снова ошибка 500.

Можно ли это сделать в одной строке с помощью регулярного выражения? Что-то вроде:

RewriteRule ^([P-p])ay ./pay.php [L] #Pay

Если да, то каков правильный способ? Если нет, как я мог бы сделать это без использования mod_spelling?

Я не знаю о простом правиле перезаписи без учета регистра, но ваша попытка сопоставить P или p очень близка к правильной. Просто опустите тире и скобки - это работает. Это то, что я тестировал для вас (как можно проще):

RewriteRule ^/[Pp]ay /pay.php

Символы в квадратных скобках - это просто альтернативы 1 символу, поэтому

RewriteRule ^[Pp][Aa][yY] /pay.php

соответствует любой комбинации нижнего и верхнего регистра. Однако я не уверен, почему ваша версия не сработала, потому что это означает «сопоставить любой символ между P и p», который должен быть P, Q, R, ... Z, some-punktuation, a, b , с ... п. Я вашу версию не тестировал.

Скобки () не должны причинять никакого вреда, они просто означают «извлечь все, что вы там найдете, и сделать это доступным как '$ 1' в строке замены».

Предложение: попробуйте со статическими файлами. Создайте test.html с фиктивным содержимым (например, «это test.html»), попробуйте получить к нему доступ в браузере через веб-сервер, который вы тестируете. Затем добавьте правило

rewriterule ^/best.html$ /test.html

и зайдите в best.html - вы должны увидеть test.html. Продолжайте менять небольшие кусочки вашего правила перезаписи, пока не найдете ту часть, которая пошла не так.

RewriteRule ^Pay ./pay.php [L] #Pay

Вы получаете ошибку 500 из-за бесконечного цикла перезаписи. Если вы просто сделаете вышеуказанный регистр нечувствительным, тогда перезаписанный URL, т.е. /pay.php соответствует сейчас без учета регистра шаблон ^Pay и т. д. и т. д.

В этом случае вы можете просто сделать свой шаблон более строгим и соответствовать просто «платите», а не любому URL-пути, который просто начинается "платить". Например:

# Pay
RewriteRule ^pay$ pay.php [NC,L]

Я также удалил ./ префикс на учреждение, этого не требуется. Кроме того, Apache не поддерживает комментарии в конце строки.

Однако имейте в виду, что при выполнении этой перезаписи без учета регистра это потенциально приводит к дублированный контент.