DirectoryIndex, не работающий правильно на переписанный URL

Я имею domain.com и sub.domain.com указывая на тот же сервер и я использую mod_rewrite для перезаписи URL для sub.domain.com к sub подкаталог. У меня есть следующее .htaccess файл в корне документа:

DirectoryIndex index.html index.php

# Prevent infinite rewrite loop.
RewriteCond %{ENV:REDIRECT_STATUS} ^$
# Send all requests addressing sub.domain.com...
RewriteCond %{HTTP_HOST} =sub.domain.com [NC]
# ...to the /sub directory.
RewriteRule ^ /sub%{REQUEST_URI} [QSA]

В sub каталог я имею index.php и нет index.html, но запросы к http://sub.domain.com кажется, игнорирую index.php в целом и возврат 404. Если я имею index.html там, однако, подается. Единственным путем я мог добраться index.php подаваться означает установить

DirectoryIndex index.php

но это не что-то, что я хочу сделать для всего сайта.

Достаточно странно URL кроме документа базируются нормальная выставка DirectoryIndex поведение. Например, http://sub.domain.com/search попытки ищут sub/search/index.html затем sub/search/index.php прежде, чем возвратиться 404.

Если я запрашиваю sub каталог от родительского домена http://domain.com/sub, Я могу видеть index.php, который оставляет меня полностью ошеломленным с проблемой.

Я включал бы журнал ошибок Apache, но я использую совместно использованный хостинг и не имею никакого способа увеличить регистрирующееся многословие. Кроме того, я не мог воспроизвести эту ошибку локально. Сервер веб-хостинга использует Apache 2.4.3, и мой локальный сервер является Apache 2.4.9.

3
задан 23 June 2014 в 11:42
2 ответа

У меня аналогичный вопрос после обновления до Ubuntu 14.04, который включает Apache 2.4.7.

Вот мой обходной путь . Эмулируйте mod_dir с помощью mod_rewrite и отключите DirectoryIndex.

#DirectoryIndex index.html index.php index.htm
DirectoryIndex disabled

RewriteCond %{REQUEST_FILENAME} -d
RewriteCond %{REQUEST_FILENAME} /$
RewriteCond %{REQUEST_FILENAME}index.html -f
RewriteRule ^(.*)$ $1index.html  [L]

RewriteCond %{REQUEST_FILENAME} -d
RewriteCond %{REQUEST_FILENAME} /$
RewriteCond %{REQUEST_FILENAME}index.php -f
RewriteRule ^(.*)$ $1index.php  [L]

RewriteCond %{REQUEST_FILENAME} -d
RewriteCond %{REQUEST_FILENAME} /$
RewriteCond %{REQUEST_FILENAME}index.htm -f
RewriteRule ^(.*)$ $1index.htm  [L]

Надеюсь, это поможет.


UPDATE: Обновление до Apache 2.4.10 исправляет эту проблему.

Благодаря Ondřej Surý это можно легко сделать на Ubuntu 14.04 с apt:

add-apt-repository ppa:ondrej/apache2
apt-get update
apt-get install apache2

p.s. OP подтвердил, что это исправлено и в Apache 2.4.9 тоже.

.
2
ответ дан 3 December 2019 в 06:34

Установите для директивы DirectoryCheckHandler значение ON .

В документации Apache говорится:

Доступно в 2.4.8 и новее. Выпуски до 2.4 неявно действуют так, как если бы было указано «DirectoryCheckHandler ON».

mod_dir всегда выполнял свои проверки независимо от того, какой обработчик был установлен, и теперь он должен быть явно включен, если не используется обработчик по умолчанию.

1
ответ дан 3 December 2019 в 06:34

Теги

Похожие вопросы