1

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

有什么想法可能是错的吗?

访问:

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
4

2 回答 2

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在请求的末尾添加 a,并且如果该文件存在,则应用该规则。

于 2013-10-31T00:53:48.343 回答
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 的内容。

于 2013-10-31T00:55:11.240 回答