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.
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]
Надеюсь это поможет.
ОБНОВЛЕНИЕ: Обновление до Apache 2.4.10 решает проблему для меня.
Благодаря Ondřej Surý это легко сделать на Ubuntu 14.04 с помощью apt:
add-apt-repository ppa:ondrej/apache2
apt-get update
apt-get install apache2
ps OP подтвердил, что это также исправлено в Apache 2.4.9.
Установите директиву DirectoryCheckHandler в ON
,
Документы Apache говорят:
Доступный в 2.4.8 и позже. Выпуски до 2.4 неявно действуют так, как если бы было указано "DirectoryCheckHandler ON".
mod_dir всегда выполнял свои проверки независимо от того, какой обработчик был установлен, и теперь он должен быть явно включен, если не используется обработчик по умолчанию.