Случай 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?

1
задан 1 September 2017 в 18:19
2 ответа
 RewriteRule ^ Pay ./pay.php [L]  #Pay
 

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

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

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

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

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

0
ответ дан 4 December 2019 в 04:38

Я не знаю простого правила перезаписи без учета регистра, но ваша попытка сопоставить 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. Продолжайте вносить небольшие изменения в правила перезаписи, пока не найдете ту часть, которая пошла не так.

0
ответ дан 4 December 2019 в 04:38

Теги

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