вызывая головную боль в RewriteRule - PullRequest
0 голосов
/ 08 марта 2010

Я борюсь с очень простой проблемой регулярных выражений в моем файле .htaccess, на которую, я надеюсь, кто-то сможет пролить свет. Основная предпосылка заключается в том, что я хотел бы научить Apache переключать любое расширение .html в расширение .var. Я думал, что правило будет положительно тривиальным:

RewriteRule ^([^.]+)\.html$ $1.var

Но часть [^.] Просто не работает. Как ни странно, это работает так

RewriteRule ^([^A-Z]+)\.html$ $1.var

Я не понимаю, почему работает это последнее правило. Предположим, я ищу файл с именем «index.html», тогда $ 1 должен соответствовать «index». и бит ".html" на самом деле не должен совпадать.

Чтобы немного расширить суть вопроса, я на самом деле ломаю голову над тем, как реализовать многоязычный сайт. Мне не нравится опция MultiView в Apache, потому что она навязывает мне плоскую структуру каталогов с расширениями файлов, которые не распознаются многими инструментами разработки. Я мог бы пойти по пути карты типов .var, но обнаружил, что конфигурация по умолчанию для Apache также не очень хорошо поддерживает это (отсюда и мои экскурсии в регулярные выражения). Поэтому, когда я использую mod_rewrite, я думаю, что могу пойти на все: когда поступает запрос на файл name.html и этот файл не существует, проверьте, существует ли файл XX / name.html, где «XX» - код языка в соответствии с предпочтениями пользователя.

Это дало бы мне более точную структуру каталогов, хотя, возможно, она не работает так же, как подход .var, в ситуации, когда языковые предпочтения браузера пользователя не поддерживаются моим сайтом (в этом случае .var будет заменить EN или аналогичный).

Есть мысли? Спасибо.

Ответы [ 2 ]

0 голосов
/ 08 марта 2010

. соответствует всему, кроме новых строк.
Внутри класса персонажа ^ означает «не».
+ означает один или несколько из предыдущего класса символов.

Итак, когда вы пишете ([^.]+), там написано "соответствует одной или нескольким символам новой строки". Поэтому, если у вас нет URL, состоящего из новых строк, за которым следует «.html», это не будет работать.

^([^A-Z]+)\.html$ работает, потому что соответствует одному или нескольким символам, которые не заглавными буквами. Если у вас есть какие-либо заглавные буквы перед ".html" в вашем URL, эта тоже не удастся.

Предложение Тима Пицкера верное: просто используйте ^(.*)\.html$, помните, что это не сработает в нечетном случае, когда в вашем URL появляются новые строки.

В нечетном случае, когда у вас действительно есть URL с символами новой строки, вы можете использовать ^([\d\D]+)\.html$, который будет соответствовать цифрам и не цифрам (т.е. всему) вплоть до ".html".

0 голосов
/ 08 марта 2010

Почему бы вам просто не использовать ^(.*)\.html$? Это будет соответствовать любой строке, которая заканчивается .html. В конце концов, имена файлов могут содержать более одной точки.

[^A-Z]+ соответствует index, если регулярное выражение применяется с учетом регистра. Возможно, в этом причина? Почему [^.]+ терпит неудачу, я не знаю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...