【问题标题】:What is the use of backslash in an URL?URL中的反斜杠有什么用?
【发布时间】:2023-03-30 16:20:01
【问题描述】:

我的 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:这只是一个示例代码,所以不提供更好的方法。

【问题讨论】:

  • `\` 是 Windows 上的路径分隔符。这可能是一个原因吗?
  • .* 必须抓住一切。所以不能。请参阅 Michel Feldheim 的回答。

标签: php apache url backslash


【解决方案1】:

上面的评论已经说了:

在 Windows 上,\ 是路径分隔符 所以在windows系统上请求'http://localhost/\'会被RewriteCond %{REQUEST_FILENAME} -d捕获,就是你的文档根目录,也就是一个目录。

你已经反转了条件,d (!-d) 所以 apache 不执行重写规则而是寻找默认的索引文件,它不存在,你得到一个 404

删除条件“不是现有目录”或将 index.php 添加到默认列表中

编辑:

我写的故事有这样一个似是而非的性格,以至于我自己都相信了 :) 实际上,这甚至不是 Windows,而是特定于 Apache。

因为security leak in CGI Apache 多年前就引入了此修复程序。 当您在请求 URL 中传递 %5C (backslash)%2F (slash) 时,它不会处理请求,而是立即返回 404 Not Found

我能够在 Apache 2.2.14 上重现此内容。

如果您不使用CGI(例如 Perl 网站),您可以安全地禁用此“安全修复”:

AllowEncodedSlashes On

这是在 Apache 2.0.46 中引入的,参见 documentation,设置此变量在我的 .htaccess 中不起作用,我必须将其放入 vhost configrestart the apache 服务器中。

【讨论】:

  • index.php 是 AFAIK 的默认文件。文档根目录中有一个 index.php 文件,但结果相同。我从$_SERVER['DOCUMENT_ROOT'] 检查了文档根目录。您是指不同的路径还是不同的默认值列表?
  • 您是否尝试删除 -d 条件?
  • 即使只尝试了RewriteRule .* index.php [L],还是一样。
  • 那我错了。原因仍然可能与 Windows 相关。我会尝试在我的 xampp 上重现这个
  • 谢谢。我不确定你用谷歌搜索了什么,但你确实找到了,谢谢 :)
猜你喜欢
  • 1970-01-01
  • 2012-10-18
  • 2016-03-12
  • 2015-08-11
  • 1970-01-01
  • 2011-06-14
  • 1970-01-01
  • 2017-02-25
相关资源
最近更新 更多