【发布时间】:2010-12-29 18:01:34
【问题描述】:
我有一个网站以不同方式处理 URL 的路径部分(不是查询字符串)中的“/”和“%2F”。根据 RFC 或现实世界,这是一件坏事吗?
我之所以这么问,是因为我一直对我使用的 Web 框架(Ruby on Rails)以及它下面的层(Passenger、Apache,例如,我必须为 Apache 启用“ALLOW_ENCODED_SLASHES”)感到惊讶。我现在倾向于完全摆脱编码斜杠,但我想知道是否应该提交错误报告,因为我发现涉及编码斜杠的奇怪行为。
至于为什么我首先有编码的斜线,基本上我有这样的路线:
:controller/:foo/:bar
其中 :foo 类似于可以包含斜杠的路径。我认为最直接的做法就是 URL 转义 foo,这样路由机制就会忽略斜杠。现在我有疑问了,很明显框架并不真正支持这一点,但根据 RFC,这样做是错误的吗?
以下是我收集到的一些信息:
RFC 1738(网址):
通常,当八位位组由字符表示时和编码时,URL 具有相同的解释。但是,对于保留字符,情况并非如此:对为特定方案保留的字符进行编码可能会改变 URL 的语义。
RFC 2396(URI):
这些字符被称为“保留”,因为它们在 URI 组件中的使用仅限于它们的保留用途。如果 URI 组件的数据会与保留用途发生冲突,则必须在形成 URI 之前对冲突数据进行转义。
(这里的转义是否意味着编码保留字符以外的其他东西?)
RFC 2616 (HTTP/1.1):
“保留”和“不安全”集中的字符(参见 RFC 2396 [42])等价于它们的“%”HEX HEX“编码。
Rails 也有 this bug report,他们似乎期望编码的斜杠表现不同:
是的,我希望得到不同的结果,因为它们指向不同的资源。
它在根目录中寻找文字文件 'foo/bar'。非转义版本正在查找目录 foo 中的文件 bar。
从 RFC 中可以清楚地看出,原始字符与编码字符对于非保留字符是等价的,但是对于保留字符又是什么情况呢?
【问题讨论】:
-
使用前端控制器的 PHP 用户:$_GET & $_REQUEST 已经被 urldecode。这可能会导致斜杠出现问题,因为您将无法分辨什么是斜杠以及什么是 %2F。如果您绝对需要查看发送的请求,请查看 $_SERVER['REQUEST_URI']。另见urldecode()@php.net