微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Aapche2 htaccess RewriteCond with ErrorDocument 404 解决方案

如何解决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 时,会发生以下情况。

  1. /donate1 不映射到目录(第一个条件)或文件(第二个条件),因此此规则在内部将其重写为 donate1.php。哪个是不正确的(但这就是这条规则的作用)。
  2. 然后 L 标志会导致当前轮次处理停止,重写引擎重新开始,传递重写的 URL,即。 donate1.php 重新加入。
  3. /donate1.php 未映射到目录或文件,因此被重写为 donate1.php.php
  4. 重写引擎重新开始......
  5. /donate1.php.php 未映射到目录或文件,因此被重写为 donate1.php.php.php
  6. 重写引擎重新开始......

这会一直重复,直到达到 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.jpgstyles.css 等)已经包含文件扩展名(文件扩展名前自然包含一个点):

RewriteRule ([^.]+) $1.php [L]

参考:

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?