当目录不存在但是由RewriteRule创建时,为什么errorDocument 404不会捕获?

时间:2010-10-01 08:22:20

标签: html security search .htaccess mod-rewrite

我的htaccess中有这个:

Options +FollowSymLinks
Options -Indexes
RewriteEngine On
RewriteRule ^annons/([a-zA-Z0-9_]+)$ ad.php?ad_id=$1 [NC]
ErrorDocument 404 /404.html

这一切都有效,除了一个问题。

当我写一个不存在的地址时,像这样:

   http://www.domain.com/some_adress_that_doesnt_exist

然后显示404.html。

但是,如果我这样写:

   http://www.domain.com/annons/some_adress_that_doesnt_exist

(注意 / annons / 实际上并不存在;它在重写规则中“已创建”。)

仅当我写 / annons / 然后时,不存在404不起作用的网址。它适用于所有其他子目录和组合,但我猜我的rewriterule有一些缺陷......

如果不工作,我的意思是显示一个空白的白页,其中没有任何信息,就像页面已存在但完全空白一样。

2 个答案:

答案 0 :(得分:1)

好吧,由于此类网址被重写为实际存在的文件(即 ad.php ),因此找到了所请求的文件。

现在,如果您的 ad.php 脚本确定所请求的资源不存在,您需要通过回复404状态代码来处理PHP,例如:

header($_SERVER['SERVER_PROTOCOL'].' 404 Not Found');

之后,您可以返回错误文档以获得相同的结果:

readfile('404.html');

答案 1 :(得分:0)

  

只有当我写/ annons /然后是一个不存在404但不起作用的网址时才会这样做。

服务器如何知道哪个/annons/存在哪些不存在?您始终会重定向到 存在的ad.php。就服务器而言,这里没有404。

不存在广告的情况是您需要在脚本中处理的内容,例如:通过抛出HTTP/1.0 404 Not Found标题并显示错误页面。 (或者,更好的是,使用SERVER_PROTOCOL变量作为@Gumbo演示)