Apache RewriteRule: это шаблон "." особый случай? - PullRequest
2 голосов
/ 16 января 2011

Я видел многочисленные примеры RewriteRule в следующем формате:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

Смысл в том, что URI, которые не поддерживаются реальным файлом, будут обрабатыватьсяCMS, подключенный через /index.php.Например, WordPress использует эту технику в своем стандартном (? ) .htaccess файле .

Однако регулярное выражение не имеет никакого смысла.Не вдаваясь в дискуссию о том, с какой строкой-предметом сопоставляется (а смотрите «Что сопоставляется?» В официальных документах Apache RewriteRule), регулярное выражение . должно соответствовать только самому первому символу !Однако он ведет себя идентично .*, то есть соответствует всей строке темы.Устанавливая RewriteLogLevel 5, я получаю те же результаты и записи журнала для . и .*.

. Я могу только заключить, что RewriteRule с шаблоном . имеет специальный случай и соответствует всей строке.(а-ля .*), а не обрабатывается с помощью механизма RegExp как есть.Однако я нигде не видел этого документально.Документация недостаточна, или я просто что-то упустил?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 16 января 2011

О, да ... Ненавижу, когда осознаю, что просто хромаю.

Я подхожу к переписыванию модов с позиции программиста.В каждой библиотеке регулярных выражений, о которой я знаю, подстановка заменяет только соответствующую часть строки темы.Например,

$ perl
$hello = "hello";
$hello =~ s/lo/p/;
print "$hello\n";
^D

Отображает

help

Однако при перезаписи мода мы не манипулируем строкой.Если URI вообще совпадает, мы полностью заменим его на Подстановку.Поэтому простого совпадения (".") Достаточно, чтобы заменить всю строку на /index.php.

Apache docs вроде этого, ноне так сильно, как для исправления того, кто находится в неправильном свободном пространстве:

Подстановка правила перезаписи - это строка, заменяющая исходный URL-путь, которому соответствует шаблон.

1 голос
/ 16 января 2011

По умолчанию регулярные выражения совпадают с любой строкой ввода.Ваше предположение, что . должен соответствовать только самому первому символу, неверно: оно будет соответствовать любому символу, первому, последнему, 24-му символу, не имеет значения: любой непустойСтрока будет соответствовать..* имеет небольшую разницу: он будет соответствовать любой строке, даже нулевой длины.

Чтобы получить поведение, о котором вы думали, используйте ^ (совпадение в начале строки) и $ (совпадение в конце).

Резюме:

. будет соответствовать любой строке, имеющей хотя бы один символ
.* будет соответствовать любой строке, даже пустой
^.$ будет соответствовать только одной строке длинной строки
^.*$ будет соответствовать любой строке в однострочном режиме или любой строке в многострочном режиме

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