&引用;欺骗“;.htaccess出现404未找到错误

&引用;欺骗“;.htaccess出现404未找到错误,.htaccess,mod-rewrite,apache2,http-status-code-404,.htaccess,Mod Rewrite,Apache2,Http Status Code 404,目前,我已经设置了.htaccess,可以通过以下方式将任何不带句点或斜杠的内容重写为具有.php扩展名的等效内容(因此“foo”在内部调用“foo.php”): RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !(.*)\.php RewriteCond %{REQUEST_FILENAME}\.php -f RewriteRule ^

目前,我已经设置了.htaccess,可以通过以下方式将任何不带句点或斜杠的内容重写为具有.php扩展名的等效内容(因此“foo”在内部调用“foo.php”):

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !(.*)\.php
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^([^/.]+)$ $1.php [L,NS]
但是,我希望对“foo.php”的直接请求返回404,就像文件不存在一样(就像有人尝试了“foo.asp”或“foo.blargh”)。我知道有[F]和[G]标志,但我不想要“禁止”(403)或“消失”(410),因为这些结果与不存在的文件返回的结果不同(404)

有办法做到这一点吗

更新1

我试过了

RewriteCond %{REQUEST_FILENAME} \.php$
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /.*\.php\ HTTP/
RewriteRule ^(.*)$ /error.php?e=404 [R=404,L,NS]
哪个有效。。。直到我尝试使用ErrorDocument处理程序。假设在我的文档根目录下有“error.php”,任何类似于
errordocument404/error?e=404
(我也尝试过error.php等)的代码都会返回错误

未找到

在此服务器上找不到请求的URL/foo.php

此外,在运行时遇到500内部服务器错误 正在尝试使用ErrorDocument来处理请求

。。。但仅当尝试访问实际存在的.php页面(如foo.php)时;任何试图访问实际上不存在的页面(因此不会触发第二个重写规则)的尝试都会转到ErrorDocument处理程序指定的页面。

找到了一个解决方案:

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ (/.*)\.php
RewriteCond %{REQUEST_FILENAME} -f
RewriteCond %{REQUEST_URI} !^/error\.php
RewriteRule . - [R=404,L,NS]

ErrorDocument 404 /error.php?e=404
具体地说,第三个重写条件使对错误页的请求不会触发重写规则(因为
请求仍然包含原始请求(与第一个重写条件匹配),并且错误页确实存在(与第二个重写条件匹配)


请注意,第三个RewriteCond与为ErrorDocument指定的URI格式相匹配。在error.php中,我使用
$\u SERVER[“REDIRECT\u SCRIPT\u URL”]
查找用户最初请求的文件(从而使404看起来像是对其请求的直接响应)。

[R=404]无效。是否尝试重写到不存在的文件?例如:
RewriteRule^(.*)$dummy404.htm[L,NS]
。这将导致404。此路由的问题是,我得到的
请求的URL/dummy.htm在此服务器上找不到。
而不是
此服务器上找不到请求的URL/foo.php。