对于重写的 URL,DirectoryIndex 无法正常工作

对于重写的 URL,DirectoryIndex 无法正常工作

我有domain.comsub.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行为。例如, tries在返回 404 之前查找http://sub.domain.com/searchsub/search/index.htmlsub/search/index.php

如果我sub从父域查询目录http://domain.com/sub,我就能看到index.php,这让我对这个问题完全感到困惑。

我会包含 Apache 错误日志,但我使用的是共享主机,无法增加日志详细程度。此外,我无法在本地重现此错误。Web 主机服务器使用的是 Apache 2.4.3,而我的本地服务器是 Apache 2.4.9。

答案1

升级到包含 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 可以解决这个问题。

谢谢翁德热伊·苏里在 Ubuntu 14.04 上可以使用 apt 轻松完成此操作:

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

ps OP 确认此问题已在 Apache 2.4.9 中修复。

答案2

设置DirectoryCheckHandler指令ON

Apache 文档说:

适用于 2.4.8 及更高版本。2.4 之前的版本隐式地执行操作,就好像指定了“DirectoryCheckHandler ON”。

mod_dir无论设置了哪个处理程序,它总是执行检查,而现在,在不使用默认处理程序时必须明确启用它。

相关内容