Каталог 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.