我有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
行为。例如, tries在返回 404 之前查找http://sub.domain.com/search
。sub/search/index.html
sub/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无论设置了哪个处理程序,它总是执行检查,而现在,在不使用默认处理程序时必须明确启用它。