«private» каталог недоступен в Apache

«private» каталог недоступен в Apache

Каталог privateнаходится под моим DocumentRoot, и, несмотря на его имя, он должен быть доступен, как и любой другой каталог. Но если я добавлю следующее RewriteRuleв httpd.conf:

RewriteRule ^/([^\.]+)$ /$1.html [L]

Apache возвращает 403 дляhttp://server/private/2201. В журнале ошибок указано

client denied by server configuration: /private/2201.html

Если я затем переименую privateв fooили напрямую запросю 2201.html, файл будет передан:

127.0.0.1 - - [21/Nov/2011:10:24:45 +0100] "GET /private/2201 HTTP/1.1" 403 214
127.0.0.1 - - [21/Nov/2011:10:24:58 +0100] "GET /foo/2201 HTTP/1.1" 200 3068
127.0.0.1 - - [21/Nov/2011:10:27:39 +0100] "GET /private/2201.html HTTP/1.1" 200 3068

Это сбивает с толку. Есть ли какое-то особое правило для каталогов с именем private? Если да, то почему прямой запрос для 2201.html работает (хотя отклоненный запрос, похоже, обрабатывает тот же ресурс, по крайней мере, согласно записи в журнале ошибок)?

решение1

Насколько мне известно , в Apache или mod_rewrite нет ничего, что делало бы это имя privateособенным. Но ваша конфигурация могла иметь правило по умолчанию, которое обрабатывает это имя по-другому. Попробуйте выполнить grep в вашей конфигурации для слова private, например

grep private /etc/httpd/httpd.conf  # RedHat, CentOS
grep -r private /etc/apache2        # Debian, Ubuntu, etc.

Если вы нашли соответствующее RewriteRule, то это и есть ваш виновник.

Ваши записи в журнале ясно показывают, что именно имя privateявляется причиной проблемы и что именно правило RewriteRule приводит к отклонению запроса.

решение2

Это постыдный случай RTM. Документация Apache относительноRewriteRuleявно указывается, что строки подстановки «будут рассматриваться как URL-путь, если только каталог с именем www не существует в корне вашей файловой системы; в этом случае он будет рассматриваться как путь в файловой системе», по крайней мере при определении RewriteRule вне контекста каталога.

Поскольку моя файловая система содержит /private, но не содержит /foo, а URL-адрес /private/2212.htmlне подвержен влиянию RewriteRule, следует ожидать вышеприведенный шаблон.

Решением было добавить флаг.[ПТ](сквозная передача) в мое RewriteRule.

Связанный контент