我在 Fedora 13 上运行一个 LAMP 服务器,它运行良好;但是,我刚刚在我当前站点的 docroot 文件夹中添加了一个“.htaccess”文件,但它被完全忽略了。
我尝试了六种不同的测试,包括这个:
RewriteEngine on
RewriteBase /
RewriteRule ^.*$ index.php
但是图像和所有其他页面都可以正常加载,而不存在的文件仍然为 404。我也尝试过这个:
order deny,allow
deny from all
但每个页面仍能正常加载。.htaccess 文件再次被完全忽略。
我们将虚拟主机记录放在 /etc/httpd/conf.d/virtual.conf 中。它看起来像这样:
NameVirtualHost *
<VirtualHost *>
ServerName intranet
DocumentRoot /var/www/default
<Directory "/var/www/default">
Options FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
<VirtualHost *>
ServerName ourwebsite.com
DocumentRoot /var/www/html/ourwebsite.com/docroot
<Directory "/var/www/html/ourwebsite.com/docroot">
Options FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
还有什么原因可能导致我们的服务器完全忽略该.htaccess
文件?
编辑:
我将 .htaccess 文件更改为上述内容,以更好地证明我的更改被忽略了。请注意,我在生产服务器上尝试了完全相同的 .htaccess 文件,并且运行良好。
编辑2:
好的,我有新信息!仅出于测试目的,我检查了一下,并暂时将所有“AllowOverride”指令更改为AllowOverride All
。我发现第一个目录条目似乎压倒了所有其他条目:
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
当我将其更改为 时AllowOverride All
,我的 .htaccess 文件开始生效。就好像AllowOverride All
我的配置文件中的所有其他指令都被忽略了!
是什么赋予了??
答案1
难以置信。还记得我说过这是一台开发服务器吗?是的……好吧,我的虚拟主机条目实际上如下所示:
<VirtualHost *>
ServerName dev.ourwebsite.com
DocumentRoot /var/www/html/dev.ourwebsite.com/docroot
<Directory "/var/www/html/ourwebsite.com/docroot">
Options FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
你看到了吗?我没看到。我忘了将我的“目录”条目更改为 dev.ourwebsite.com 而不是 ourwebsite.com —— 这造成了很大的不同。我只是假设如果目录不存在,Apache 会抛出一个错误;但这仅适用于 DocumentRoot 指令。是基于匹配的 —— 这意味着如果它与传入请求匹配,它就会应用规则,否则,它并不关心你是否告诉它在 magic unicorns 上允许覆盖。
让这成为其他寻求帮助的人的一个教训——当所有其他方法都失败时,请考虑万能的 Typo。
答案2
检查虚拟主机声明上方的“httpd.conf”中是否存在任何其他“AllowOverride None”。很可能,您在 docroot 中存在“AllowOverride None”。
答案3
我在一台新服务器上遇到了这个问题,最终意识到 mod-rewrite 默认并未启用。
ln -s /etc/apache2/mods-available/rewrite.load /etc/apache2/mods-enabled/rewrite.load
答案4
就我而言,apache 用户无法读取 .htaccess 文件。
我解决了
chown ubuntu:www-data .htaccess
chmod 750 .htaccess