htaccess重写导致500错误而不是404错误

时间:2009-11-16 23:56:04

标签: .htaccess http-status-code-404

我最近在我的.htaccess文件中添加了一小段代码:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ $1.php [L,QSA]

好吧,我想我明白这里发生了什么。如果找不到文档,删除PHP文件扩展名的这一小段代码会导致循环。这个循环导致500服务器错误而不是(正确的)404.不幸的是我对这些重写实际上做了什么很少了解,所以我不知道如何重写它只是在文档存在时才触发这个重定向。 / p>

我已经做了一些阅读,我不确定Apache认为什么是“常规”文件。我的意思是它有效,但为什么第一行不是-f而不是!-f-u是实现这一目标的唯一方法吗?

3 个答案:

答案 0 :(得分:20)

您应该测试新路径是否指向现有文件:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*)$ $1.php [L,QSA]

否则您将获得无限递归(错误500)。

答案 1 :(得分:2)

正如您所建议的那样,这些规则的目的是允许某人在不包含PHP扩展名的情况下请求页面。因此,如果您在 example.com 上有一个名为 about.php 的文件,那么有人可以使用 http://example.com/about 中的网址为了访问它。

但是,如果有人直接请求 http://example.com/about.php ,则您不希望将其重写为 http://example.com/about.php.php 。同样,您不希望重写对图像,CSS样式表等的请求。这是2 RewriteConds的用武之地,它们的条件是只有当请求与实际存在于文件(!-f)或目录(!-d)不匹配时才会进行重写。站点。

要回答为什么你得到500,这可能是因为Apache中的权限被配置为不允许在htaccess文件中重写规则或其他几个原因之一。检查error_log的结尾以查看其中是否有任何消息。

答案 2 :(得分:0)

首先,这里有一些参考可以更好地理解mod_rewrite模块:

mod_rewrite Documentation

mod_rewrite Cheat Sheet

你看到的问题是它正在检查这两个条件,默认为[AND],当你只想检查一个时,试试这个:

RewriteCond %{REQUEST_FILENAME} !-f [OR]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ $1.php [L,QSA]