URL中使用反斜杠有什么用?

时间:2012-12-01 15:33:02

标签: php apache url backslash

我的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看起来哪里找不到文件?

注意:我的系统是带有Apache 2.2.21和PHP 5.3.10的Windows。 注2:这只是一个示例代码,所以不要提供更好的方法。

1 个答案:

答案 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}服务器。