FireFox 和 Chrome 在 url 中处理 \(反斜杠)的不同行为

Posted

技术标签:

【中文标题】FireFox 和 Chrome 在 url 中处理 \\(反斜杠)的不同行为【英文标题】:Different behaviours of treating \ (backslash) in the url by FireFox and ChromeFireFox 和 Chrome 在 url 中处理 \(反斜杠)的不同行为 【发布时间】:2012-05-13 08:37:29 【问题描述】:

背景

根据我的经验,当我的 ubuntu 工作站配置在具有活动目录的域上时,为我创建的用户名是按照以下模式。

域名\用户名

在 linux 上使用 apache 的 userdir 扩展需要在 URL 中使用用户名才能访问主目录中的 public_html

http://localhost/~domain_name\user_name

问题 A:

Chrome 将 URL 中的所有反斜杠 '\' 字符转换为正斜杠 '/' 并且生成的 url 变成完全不同并且总是结果 未找到。

http://localhost/~domain_name/user_name

另一方面,Firefox 不会将反斜杠转换为正斜杠,因此对预期目标的 http 请求由网络服务器提供。

Common solution is to encode back slash in %5C.

问题 B:

如果我们在 CSS @import 构造中使用类似的路径(路径中包含 \),那么作为 HTTP Get Request 的 css 文件的导入过程将失败,并报告 404 错误,并且在404 错误完全错过了 \ 的存在。这意味着 \ 在调用 GET 请求之前从 URL 中删除。

这种行为在 Firefox 和 Chrome 中很常见。但他们有不同寻常的解决方案

Firefox 需要转义反斜杠才能在 css 导入过程中工作。

@import url("http://localhost/~domain_name\\user_name/path/to/css");

Chrome 像往常一样需要编码反斜杠解决方案。

@import url("http://localhost/~domain_name%5Cuser_name/path/to/css");

处理URL中\的统一解决方案是什么? 有没有办法避免 \ 出现在用户名中?

【问题讨论】:

【参考方案1】:

处理 URL 中的反斜杠的统一解决方案是使用 %5C。 RFC 2396 根本不允许在 URL 中使用该字符(因此有关该字符的任何行为都只是错误恢复行为)。 RFC 3986 确实允许这样做,但没有得到广泛实施,尤其是因为它与现有的 URL 处理器不完全兼容。

特别是 Chrome,它与 IE 做同样的事情:假设您在任何时候键入反斜杠时都表示正斜杠,正如您所发现的那样,因为这就是 Windows 文件路径的作用。

【讨论】:

你能链接到你的测试用例吗?我刚刚在本地测试了它,它确实似乎工作正常。 我不认为 RFC 3986 改变了 URI 中裸“\”的状态;它仍然无效。 请注意,Firefox 目前存在一个错误,它修改了 URL 栏以创建一个用户友好的 URL,但现在无法复制和粘贴,因为它不再是正确的 URL 编码:bugzilla.mozilla.org/show_bug.cgi?id=1026938【参考方案2】:

尝试使用 Firefox 中的 Slashy 插件来帮助您。这里是它的链接。

Slashy

【讨论】:

你刚刚救了我... :) +1 链接结果为 404 插件好像被移除了。我会尝试找到类似的东西 @cowlinator - 插件链接已更新【参考方案3】:

此反斜杠自动转换问题已在 Chrome 版本 >= 53.0.2785.116 中修复。

现在反斜杠被正确处理为 %5C

【讨论】:

我很确定它没有。在 Chrome 62.0.3202.89 中,当在地址栏中输入或在 DevTools 的控制台中使用 window.location = "<url>"; 时,它仍然会发生。

以上是关于FireFox 和 Chrome 在 url 中处理 \(反斜杠)的不同行为的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Chrome 和 Firefox 获取打开页面的 URL?

本地主机在 chrome 和 firefox 中不起作用

网站可在 Firefox 和 IE 中运行,但不适用于 Chrome

图标在 Chrome 和 firefox 中显示,但在 IE 中不显示

JavaScript 本地存储在 Chrome 和 Edge 中被删除,但在 Firefox 中没有

如何从 Firefox 或 Chrome 浏览器手动发送 HTTP POST 请求