如何解决Aapche2 htaccess RewriteCond with ErrorDocument 404 解决方案
Aapche2 htaccess RewriteCond
我发现一些奇怪的条件有效,但我不知道为什么:)
/error.PHP
/donate.PHP
/test/index.PHP
在我使用的 htaccess 文件中
ErrorDocument 404 /error.PHP
RewriteEngine On
# WHY THIS LINE NEEDED TO GET IT WORKS
RewriteCond %{REQUEST_FILENAME} ^$
#
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (.*) $1.PHP [L]
这个。
http://localhost/donate calls internal http://localhost/donate.PHP
同时
http://localhost/donate1 calls internal http://localhost/error.PHP
和
http://localhost/test/ call internal http://localhost/test/index.PHP
到目前为止一切都很好
但是当我把它注释掉
#RewriteCond %{REQUEST_FILENAME} ^$
然后我在调用时收到内部服务器错误 /donate1 而不是 /error.PHP
谁能解释一下步骤,为什么会这样?
解决方法
#RewriteCond %{REQUEST_FILENAME} ^$
因为您的指令实际上并没有做您认为它们正在做的事情。事实上,在取消注释“hacky”条件的情况下,他们根本没有做任何事情,除了防止 500 Internal Server Error(这是由于内部重写循环造成的,因为规则完全不正确)。
该条件检查 REQUEST_FILENAME
服务器变量是否为空。它从不为空,因此总是失败,因此永远不会触发后面的 RewriteRule
指令。
你可以完全删除你的 mod_rewrite 指令,你会得到相同的结果。
http://localhost/donate
调用内部 http://localhost/donate.php
很可能是 MultiViews (mod_negotiation) 将 /donate
重写为 /donate.php
。不是您发布的指令(正如我所提到的,实际上并没有做任何事情)。
http://localhost/test/
调用内部 http://localhost/test/index.php
这是由 mod_dir (DirectoryIndex
) 引起的。同样,与您发布的指令无关。
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (.*) $1.php [L]
然后我在调用 /donate1
而不是 /error.php
时收到内部服务器错误
因为当您请求 /donate1
时,上述指令会触发内部重写循环(这会导致 500 内部服务器错误响应)。 /donate1
到 /donate1.php
到 /donate1.php.php
到 /donate1.php.php.php
等(见下文)。
MultiViews 不适用于此处,因为没有 /donate1
可以感知映射到的文件,例如。 /donate1.php
或 /donate1.html
或其他一些可识别的资源,具有不同的文件扩展名,返回 text/html
mime-type。
当您请求 /donate1
时,会发生以下情况。
-
/donate1
不映射到目录(第一个条件)或文件(第二个条件),因此此规则在内部将其重写为donate1.php
。哪个是不正确的(但这就是这条规则的作用)。 - 然后
L
标志会导致当前轮次处理停止,重写引擎重新开始,传递重写的 URL,即。donate1.php
重新加入。 -
/donate1.php
未映射到目录或文件,因此被重写为donate1.php.php
。 - 重写引擎重新开始......
-
/donate1.php.php
未映射到目录或文件,因此被重写为donate1.php.php.php
。 - 重写引擎重新开始......
- 等
这会一直重复,直到达到 10 次(默认)内部重写并且服务器“中断”并返回 500 错误响应。服务器错误日志将包含此错误的详细信息,例如:
AH00124:由于可能的配置错误,请求超出了 10 个内部重定向的限制。如有必要,请使用“LimitInternalRecursion”来增加限制。使用“LogLevel debug”获取回溯。
(尽管您很少需要更改此内部重定向限制 - 它几乎总是表明您的脚本中存在错误。)
解决方案
你要么完全删除你的 mod_rewrite 指令,让 MultiViews 做它的事情,要么你禁用 MultiViews 并“纠正”你的 mod_rewrite 指令。
例如:
Options -MultiViews
ErrorDocument 404 /error.php
RewriteEngine On
# Rewrite extensionless URLs to ".php" if they exist
RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule (.+) $1.php [L]
优化...如果您的网址(映射到 .php
文件)不包含点,那么您可以简单地排除包含点的网址,这样您就不会不必要地测试对静态资源的请求(例如. image.jpg
、styles.css
等)已经包含文件扩展名(文件扩展名前自然包含一个点):
RewriteRule ([^.]+) $1.php [L]
参考:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。