Gle*_*len 17 security .htaccess http http-status-code-403
这里已经发布了几个关于在特殊情况下返回404而不是403的问题(例如,.ht*文件或某个目录),但我无法弄清楚如何简单地替换所有 403响应("好吧,它存在,但你仍然必须在404中找到一种方式("抱歉,从未听说过").我希望有一个简单的解决方案,不需要更新正则表达式或.htaccess的其他位来匹配站点更改,只需一个简单的指令:"每当你决定返回403时,返回404代替"到整个站点,无论配置如何变化.
然后,如果顶级.htaccess包含"Options -Indexes",并且任何给定目录不包含index.html(或者equiv),则裸目录URL将返回404,但是如果我将index.html添加到该目录,相同的裸目录URL将返回index.html,不需要任何.htaccess文件的更新.
我甚至不关心,如果我曾经密码一个目录,一个错误的密码返回404(因为404 - > 403映射).在那种情况下,我没有通过返回404隐藏任何东西,但它也没有造成任何伤害.如果有办法取消对特殊情况的一般403-> 404映射(而不是特殊情况下的DO),那可能会更有用.
当然,如果我忽略了什么,请直截了当地说.
编辑:Drat.我试图在这里写一个质量好的问题,但我在第二段中对"选项 - 索引"行为的描述结果证明是错误的.没有该行,如果存在于目录中,则裸目录URL显示"index.html"; 否则,它会显示目录的内容.(如果index.html存在,将/ dir转发到/dir/index.html是Web主机的默认设置,除非我弄错了.)添加"Options -Indexes"行会阻止它在公共场所播放我的衣物(返回403,而不是404,但仍然比暴露dir内容更好),但现在即使index.html存在,裸目录URL也会返回403.
我希望一个裸露的目录URL"mysite.com/mydir"显示/mydir/index.html如果它存在,"404"如果它没有,但显然它不仅仅是用404替换403s.
Mar*_*cel 12
要在这里完成一个更好的答案(如@WebChemist和@JennyD所述),解决此问题的一个好方法是404 Not Found从用于处理403错误的文档返回.就个人而言,我做了类似以下的事情:
.htaccess在web根目录(相关摘录):ErrorDocument 400 /http-errors.php
ErrorDocument 403 /http-errors.php
ErrorDocument 404 /http-errors.php
http-errors.php在web根目录(简明的工作示例):<?php
$status = $_SERVER['REDIRECT_STATUS'];
// If it's a 403, just bump it up to a 404
if ( $status == 403 ) $status++;
$codes = array(
  400 => array( '400 Bad Request', 'The request cannot be fulfilled due to...' ),
  404 => array( '404 Not Found', 'The resource you requested was not found...' ),
  500 => array( '500 Internal Server Error', 'The request was unsuccessful...' )
);
$title = $codes[$status][0];
$message = $codes[$status][1];
header( $_SERVER['SERVER_PROTOCOL'] . ' ' . $title );
echo "<h1>$title</h1>\n<p>$message</p>";
| 归档时间: | 
 | 
| 查看次数: | 9965 次 | 
| 最近记录: |