【问题标题】:Apache .htaccess: How to rewrite backslash with slash on Firefox?Apache .htaccess:如何在 Firefox 上用斜杠重写反斜杠?
【发布时间】:2011-02-03 15:15:10
【问题描述】:

如何在 Firefox 上用斜杠'/'重写反斜杠'\'

Chrome、IE、Safari、Opera 已构建浏览器用斜杠重写反斜杠。
但是 Firefox 3.6.13 返回 404 错误页面

# Why Firefox returns 404 error page?
RewriteCond %{REQUEST_URI} (.*)\\(.*)
RewriteRule .* %1/%2 [R=301,L]

【问题讨论】:

    标签: apache .htaccess mod-rewrite url-rewriting rewrite


    【解决方案1】:

    这是 Apache 和 FF 的错误,https://issues.apache.org/bugzilla/show_bug.cgi?id=35256
    希望它会在不久的功能中得到修复。

    1. AllowEncodedSlashes 应该在默认情况下真正“开启”,甚至可能已弃用。 ...
    2. RFC 中没有一个反斜杠 (\) 被列为保留字符。因此,%5C
      应该始终被解码,就像 %7E 被转换为波浪号 (~)

    在 Apache 上解决它:
    VirtualHost httpd-vhosts.conf 或httpd.conf 中添加AllowEncodedSlashes On 和.htaccess:

    RewriteEngine On 
    RewriteCond %{REQUEST_URI} ^(.*)\\(.*)$
    RewriteRule .* %1/%2 [R=301,NC,L]
    

    【讨论】:

      【解决方案2】:

      令人惊讶的是,这似乎是正确的行为。反斜杠不在 HTTP 或 HTTPS URL 中允许的字符(根据RFC 1738),因此它们应该被转义。请注意,RFC 明确提到反斜杠是不安全的字符:

      其他字符不安全,因为 众所周知,网关和其他传输代理有时会修改 这样的字符。这些字符是“{”、“}”、“|”、“\”、“^”、“~”、 “[”、“]”和“`”。

      所有不安全的字符必须始终在 URL 中进行编码。

      换句话说,Firefox 正在做正确的事情,即使它破坏了错误使用反斜杠的页面(主要是由于将 URL 语法与 Windows 路径语法混淆)。其他浏览器试图读懂页面作者的想法,在发送请求之前将反斜杠转换为正斜杠;这是否是一件好事是一个见仁见智的问题。

      您是否尝试匹配反斜杠的转义版本 - %5C

      【讨论】:

      • 至于意见-我认为试图猜测作者的意图注定要失败(参见过去十年中的quirks mode雷区,由此类尝试创建阅读)。如果 URL 被严重破坏,浏览器不应该尝试“修复”它——它应该破坏而不是强化作者编写错误代码的习惯。 作者修复它会导致“嗯,为我工作”。
      • 感谢重播!但是RewriteCond %{REQUEST_URI} (.*)%5c(.*)$ 也没有解决它。仅适用于 www.google.com/intl/en\about.html 的 Firefox 将返回 404 错误页面,其他浏览器将返回 www.google.com/intl/en/about.htm
      • @Binyamin:是的,而且总是会,因为FF实际上是在发送反斜杠,而其他人会用斜杠替换它;重写应该发生在您的服务器上(而不是在 Google 的服务器上),它不会在 所有 服务器上解决此问题。另外,你有[NC] 参数(不区分大小写的匹配)吗?
      • 不幸的是,它也不适用于NC。其他一些建议如何用 FF 上的斜杠重写反斜杠!?
      猜你喜欢
      • 2015-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-09
      • 2011-09-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多