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

Условие перезаписи Apache считает, что каталог - это не каталог?

На моем сервере (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