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

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.

У меня возникла аналогичная проблема после обновления до 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]

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


ОБНОВИТЬ: Обновление до Apache 2.4.10 решило проблему для меня.

Благодаря Ондржей Суры в Ubuntu 14.04 это легко сделать с помощью apt:

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

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

Установить DirectoryCheckHandler директива к ON.

Документы Apache говорят:

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

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