我的PHP项目中有一个前端控制器。这是代码;
.htaccess
档案
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* index.php [PT,L]
</IfModule>
index.php
档案
<?php
list($url) = explode('?', $_SERVER['REQUEST_URI']);
$url = trim(trim($url), '/');
if(!file_exists('pages/'.$url.'.php')
header('Location: 404.html');
require_once 'inc/head.php';
require_once 'pages/'.$url.'.php';
require_once 'inc/foot.php';
?>
我假设每个请求的URL都必须通过index.php文件。但是,如果URL服务器中有\
(如%5C),则答案为“未找到”。
问题;
\
字符有例外?有没有这样的人物?\
字符重新使用Apache来搜索文件是什么?为什么不忽略?注意:我的系统是带有Apache 2.2.21和PHP 5.3.10的Windows。 注2:这只是一个示例代码,所以不要提供更好的方法。
答案 0 :(得分:2)
以上评论已经说过:
在Windows \
上是路径分隔符
因此,请求'http://localhost/\'
在Windows系统上RewriteCond %{REQUEST_FILENAME} -d
将被!-d
捕获,只是您的文档根目录。
你已经颠倒了条件d(security leak in CGI
)所以apache没有执行重写规则但是查找默认索引文件,它不存在,你得到404
删除条件“不是现有目录”或将index.php添加到默认列表中
编辑:
我写的故事有这样一个看似合理的特点,我自己相信:) 实际上,这甚至不是Windows,而是Apache特定的。
由于404 Not Found
Apache多年前将其作为修复程序引入。
当您在请求网址中传递%5C (backslash)
或%2F (slash)
时,它会立即返回Apache 2.2.14
,而不是处理请求。
我能够在CGI
上重现这一点。
如果您不使用AllowEncodedSlashes On
(例如Perl网站),您可以安全地停用此“安全修复程序”:
.htaccess
这是在Apache 2.0.46中引入的,请参阅documentation,设置此变量在我的vhost config
中不起作用,我必须将其放入restart the apache
和{{1}服务器。