Htaccess文件的内部服务器错误

时间:2013-10-31 00:34:57

标签: .htaccess

我正在创建一个htaccess文件,并尝试添加一个404页。 但是,如果我转到此网站上的非现有页面,则不会显示404页面。相反,我得到“500内部服务器错误”。

任何想法可能出错?

的.htaccess:

SetEnvIfNoCase User-Agent "^libwww-perl*" block_bad_bots
Deny from env=block_bad_bots

RewriteEngine On
RewriteRule ^solution-([^/]*)/([^/]*)$ /solutions.php?category=$1&solution=$2 [L]
RewriteRule ^solution-([^/]*)$ /solutions.php?category=$1 [L]
RewriteRule ^page-([^/]*)$ /about.php?page=$1 [L]

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

ErrorDocument 404 /404.php

2 个答案:

答案 0 :(得分:1)

这是导致错误的规则:

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

这是因为如果请求是针对不存在的文件不存在的目录,则会应用该规则。这意味着什么都不会返回404,因为这个规则将被应用。现在问题是该规则重写了.php扩展名,即使php文件实际上并不存在。所以重写引擎再次循环,规则再次应用,然后引擎循环,规则再次应用,等等。

您需要添加其他条件:

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

条件是,如果您在请求的末尾添加.php,并且该文件存在,则应用该规则。

答案 1 :(得分:1)

你很亲密。将来,您可以调试.htaccess文件,并通过在每行(或一组行)之前添加#并查看错误位置来确定失败的原因。

首先,您无需重新声明RewriteEngine On两次。一次就够了。

如果你禁用了第二个规则块(第二个RewriteEngine On的位置,你会注意到你的错误处理程序正常工作。那就是你的错误来自哪里。所以让我们把它分解。

RewriteCond %{REQUEST_FILENAME} !-d

这意味着:对于与物理目录不匹配的所有请求。

RewriteCond %{REQUEST_FILENAME} !-f

这意味着:对于与物理文件不匹配的所有请求。

RewriteRule (.*) $1.php [L]

这意味着:对于上述所有匹配条件,请将用户发送到以.php为后缀的文件名。示例:mysite.com/bananas会尝试加载页面bananas.php

的内容

所以它在最后一行导致你的错误。如果您有意输入不存在的URL,它会尝试加载bananas.php然后抛出错误,因为该文件不存在。但逻辑不会故障转移到ErrorDocument处理程序,因为它已经遇到查找该文件的错误。

因此,简短的解决方案是删除该行块,然后由/404.php提供第一行不处理的任何行。或者,您可以将最后一行从$1.php更改为全能脚本(例如index.php),然后执行自己的错误检查并提供404.php的内容。