FireFox和Chrome在处理URL中的反斜杠(\)时表现不同。

23

背景

根据我的经验,当我的Ubuntu工作站配置在活动目录上时,为我创建的用户名遵循以下模式。

域名\用户名

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

http://localhost/~域名\用户名

问题A:

Chrome将URL中的所有反斜杠'\'字符转换为正斜杠'/',结果URL完全不同,并且始终显示未找到

http://localhost/~域名/用户名

另一方面,Firefox不会将反斜杠转换为正斜杠,因此Web服务器会提供对目标的HTTP请求。

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

问题 B:

如果我们在 CSS 的 @import 构造中使用类似的路径(包含路径中的\),则 CSS 文件的导入过程将作为 HTTP Get 请求失败,并报告 404 错误。在 404 错误中报告的 URL 完全缺少\的存在。这意味着在调用 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中的反斜杠(\)? 有没有办法避免反斜杠(\)出现在用户名中?
3个回答

17

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

特别是Chrome和IE一样做:每次键入反斜杠时都会假定您想要一个正斜杠,因为这是Windows文件路径所做的。


你能提供测试用例的链接吗?我刚在本地测试了一下,看起来它确实可以正常工作。 - Boris Zbarsky
7
我认为RFC 3986并未改变URI中“\”的状态;它仍然是无效的。 - Julian Reschke
请注意,Firefox目前存在一个错误,它会修改URL栏以创建一个用户友好的URL,但由于它不再正确地进行URL编码,因此现在无法复制和粘贴:https://bugzilla.mozilla.org/show_bug.cgi?id=1026938 - Ryan

3

建议您在Firefox浏览器中使用Slashy插件来帮助您。这是它的链接。

Slashy


你刚刚救了我一命... :) +1 - slayedbylucifer
链接结果显示404。 - cowlinator
似乎插件已被移除。我会尝试找到类似的东西。 - cafebabe1991
1
@cowlinator - 插件链接已更新。 - cafebabe1991

0
此反斜杠自动转换问题已在Chrome版本>=53.0.2785.116中得到修复。
现在,反斜杠被正确地处理为%5C

3
我很确定情况并没有改变。在使用Chrome 62.0.3202.89时,在地址栏中输入或在开发者工具的控制台中使用window.location = "<url>";时,该问题仍然存在。 - bit2shift

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接