На моем сервере (Apache2, Ubuntu 10.04), wpsa
это каталог в моем корневом веб-каталоге. При доступе к URL-адресу mysite.com/wpsa все равно запускается правило ReWriteRule, которое не должно происходить, если запрошенный файл является каталогом.
Вот мои правила:
RewriteCond %{REQUEST_URI} !^/index.php$
RewriteCond %{REQUEST_URI} !^/$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* /000_ROUTE.php [L]
Это из журнала перезаписи:
applying pattern '.*' to uri '/wpsa/'
RewriteCond: input='/wpsa/' pattern='!^/index.php$' => matched
RewriteCond: input='/wpsa/' pattern='!^/$' => matched
RewriteCond: input='/wpsa/' pattern='!-f' => matched
RewriteCond: input='/wpsa/' pattern='!-d' => matched
rewrite '/wpsa/' -> '/000_ROUTE.php'
local path result: /000_ROUTE.php
Он говорит: "WPSA - это каталог?" -> «Нет, это не так». Но на самом деле это так. Почему он думает, что мой каталог не является каталогом?
Если я добавлю:
ReWriteRule ^/wpsa - [L,NC]
перед этим правилом он загружает каталог. Но мне не нужно создавать правило, которое ничего не делает для каждого каталога, не так ли? Для этого нужны условия -f / -d.
Ваш веб-корень не /
(верно?), так что правильно, что -d
не попал. Это пытается соответствовать /wpsa/
к файловой системе, буквально - не относительно корневого веб-узла.
Причина, по которой это дает вам /wpsa/
в качестве строкового ввода вместо /path/to/webroot/wpsa
, который будет работать должным образом, если вы используете %{REQUEST_FILENAME}
в неправильном контексте.
когда %{REQUEST_FILENAME}
используется в контексте, где отображение файловой системы уже выполнено, например, в <Directory>
блокировать или .htaccess
файл, возвращается полный путь и -d
будет работать так, как вы ожидаете.
REQUEST_FILENAME
Полный путь локальной файловой системы к файлу или сценарию, соответствующему запросу, если он уже был определен сервером во время ссылки на REQUEST_FILENAME. В противном случае, например, при использовании в контексте виртуального хоста, то же значение, что и REQUEST_URI.
Вы, кажется, используете его в <VirtualHost>
или <Location>
context, что делает его функционально идентичным %{REQUEST_URI}
. Если вы хотите сохранить его в этом контексте, попробуйте:
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-d