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

Проблемы с поиском "." С помощью htaccess

Я создаю веб-сайт, который (в идеале) позволял бы пользователям получать доступ к домашним страницам других пользователей с URL-адресом в формате «www.mysite.com/ThisLanham», где «ThisLanham» - имя пользователя. Имя пользователя начинается с буквы и может состоять из любых буквенно-цифровых символов, а также символа подчеркивания, дефиса или точки.

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

RewriteRule ^([a-zA-Z][0-9a-zA-Z-_]*)/?$ Page/?un=$1 [NC,L]

Однако я пробовал несколько способов проверки периода, но все они привели к ошибке 500 Internal Server Error. Вот несколько моих попыток:

RewriteRule ^([a-zA-Z][0-9a-zA-Z-\_\\.]\*)/?$ Page/?un=$1 [NC,L]
RewriteRule ^([0-9a-zA-Z-\_\\.]\*)/?$ Page/?un=$1 [NC,L]
RewriteRule ^([a-zA-Z].\*)/?$ Page/?un=$1 [NC,L]
RewriteRule ^(.\*)/?$ Page/?un=$1 [NC,L]

тоже пробовал ...

RewriteCond $1 != index.php
RewriteRule ^([a-z][0-9a-z-_.]*)/?$ Page/?un=$1 [NC,L]

Мой план резервного копирования состоит в том, чтобы больше не разрешать пользователям включать точки в свои имена пользователей, но я бы предпочел найти решение. Любые идеи?

Согласно документация для регулярных выражений Perl (которые использует Apache),

RewriteRule ^([a-zA-Z][0-9a-zA-Z\-_.]*)/?$ Page/?un=$1 [NC,L]

или

RewriteRule ^([a-zA-Z][0-9a-zA-Z_.-]*)/?$ Page/?un=$1 [NC,L]

должно сработать. Точка рассматривается как реальная точка, а не метасимвол, когда она является частью класса символов (т.е. между скобками [ и ]), поэтому в этом случае вам не нужно его избегать.

С другой стороны, дефис имеет особое значение в классе символов (если это не первый или последний символ в классе, см. Второй пример выше).

http://articles.sitepoint.com/article/apache-mod_rewrite-examples

RewriteCond %{HTTP_HOST} !^www\.example\.com$ [NC]
RewriteRule .? http://www.example.com%{REQUEST_URI} [R=301,L]

Здесь, чтобы обозначить, что {HTTP_HOST} является переменной Apache, мы должны добавить к ней символ%. Регулярное выражение начинается с символа! символ, что приведет к выполнению условия, если оно не соответствует шаблону. Мы также должны экранировать символ точки, чтобы он соответствовал буквальной точке, а не любому символу, как в случае с метасимволом точки. Мы также добавили флаг No Case, чтобы сделать эту операцию нечувствительной к регистру.

Может это поможет?