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