我有一个 .htaccess 文件无法正常工作。我知道它无法正常工作,因为我在其中写入了随机内容,但我没有收到 500 错误。即使我编写了正确的代码,它也无法正常工作。我已验证它位于我的根目录中,并且具有正确的文件名。这是来自 http.conf 的目录“标签”:
<Directory />
Options FollowSymLinks
AllowOverride All
Order deny,allow
Deny from all
</Directory>
我使用<?php phpinfo(); ?>
并验证了 mod_rewrite 已启用,但仍然没有运气。
答案1
我想知道这Deny from all
是否是问题所在。如果 Apache 知道它将发送 403 响应,它甚至可能不会去读取 .htaccess 文件。
其他潜在问题可能包括文件名称中的拼写错误.htaccess
(尽管您确实说过您已经检查过这个问题)、AccessFileName
与正常值不同的值以及对任何通向 DocumentRoot 的目录的文件/目录权限。
可能值得使用 strace 来验证 Apache 是否确实在读取您的.htaccess
文件。确保 Apache 已停止,然后按以下方式启动它:
sudo strace -f -e open apache2 -X
然后再次提出您的请求。
答案2
<Directory /> Options FollowSymLinks AllowOverride All
您永远不应该AllowOverride All
为整个文件系统(即<Directory />
容器内)设置。这应该是(并且默认是)AllowOverride None
有原因的。Apache 明确警告不要这样做。
在此处设置将导致 Apache沿着目录树一直AllowOverride All
扫描到根目录的文件。.htaccess
.htaccess
您的文件未被处理的最可能原因是您有更多具体的 <Directory>
容器(可能在<VirtualHost>
)在已设置的配置的其他地方,覆盖该目录树的AllowOverride None
设置。<Directory />
但是,通过设置,AllowOverride All
Apache<Directory />
很可能扫描.htaccess
所有父母可能会导致性能和安全问题的目录。
<Directory /> : Deny from all
由于您的网站大概可以访问,所以您一定在某处有一个更具体的<Directory>
容器?(我假设您没有收到“403 Forbidden”响应?)