Dok*_*r J 2 .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 ^([^/.]+)$ $1.php [L,NS]
Run Code Online (Sandbox Code Playgroud)
但是,我想直接请求"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]
Run Code Online (Sandbox Code Playgroud)
哪个有效...直到我尝试使用ErrorDocument处理程序.假设我的文档根目录中有"error.php",那么ErrorDocument 404 /error?e=404
(我也尝试过使用error.php等)的任何内容都会反复出错
未找到
在此服务器上找不到请求的URL /foo.php.
此外,尝试使用ErrorDocument处理请求时遇到500内部服务器错误错误.
...但仅在尝试访问实际存在的.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
Run Code Online (Sandbox Code Playgroud)
具体来说,第三个RewriteCond保持对错误页面的请求不会触发RewriteRule(因为THE_REQUEST
仍然包含原始请求(与第一个RewriteCond匹配),并且错误页面确实存在(与第二个RewriteCond匹配).
请注意,第三个RewriteCond匹配为ErrorDocument指定的URI格式.在error.php中,我$_SERVER["REDIRECT_SCRIPT_URL"]
用来找出用户最初请求的文件(从而使404看起来像是对他们的请求的直接响应).
归档时间: |
|
查看次数: |
4550 次 |
最近记录: |