Mod-Rewrite

重寫 URL 時,DirectoryIndex 無法正常工作

  • December 6, 2017

我有domain.comsub.domain.com指向同一台伺服器,並且我正在使用 mod_rewrite 重寫子目錄sub.domain.com的URL。我在文件根目錄中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行為。例如, try在返回 404 之前http://sub.domain.com/search查找sub/search/index.htmlthen 。sub/search/index.php

如果我sub從父域查詢目錄http://domain.com/sub,我可以看到index.php,這讓我對這個問題完全目瞪口呆。

我會包含 Apache 錯誤日誌,但我使用的是共享主機並且無法增加日誌記錄的詳細程度。此外,我無法在本地重現此錯誤。Web 託管伺服器使用的是 Apache 2.4.3,而我的本地伺服器是 Apache 2.4.9。

升級到包括 Apache 2.4.7 的 Ubuntu 14.04 後,我遇到了類似的問題。

這是我的解決方法。用模擬 ,然後禁用。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 中也已修復。

引用自:https://serverfault.com/questions/607207