(?= ...)
и (?! ...)
- это специальный синтаксис в регулярных выражениях Perl и в PCRE , который является библиотекой регулярных выражений, используемой Apache. Это, соответственно, положительные и отрицательные косвенные утверждения: они соответствуют пустой строке, если текст после нее соответствует или не соответствует содержимому в скобках.
Они не захватывают, поэтому они не определяют $n
(это было бы бессмысленно, поскольку они соответствуют пустой строке). (?: ...)
также не захватывает, он используется для группировки подвыражений.
Ваше первое правило должно работать в .htaccess
(но не в файле конфигурации виртуального хоста), хотя правильнее было бы написать его как
RewriteRule ^(?!index\.php$)(.*)$ index.php?path=$1 [L]
Возможно, другое правило взаимодействует с ним. Вы можете проверить, что именно сопоставляется и переписывается с RewriteLog
и RewriteLogLevel
.