我有一个网站,会根据URL路径(而不是查询字符串)中的/
和%2F
进行不同处理。在RFC或现实世界中,这样做是不是不好的事情?
我之所以问,是因为我一直在使用的web框架(Ruby on Rails)以及底层的组件(Passenger,Apache等)给我带来了一些小惊喜(例如,我必须启用ALLOW_ENCODED_SLASHES
才能让Apache正常工作)。现在我倾向于完全摒弃编码斜杠,但我想知道是否应该在遇到涉及编码斜杠的奇怪行为时提交错误报告。
至于为什么我最初要使用编码斜杠,基本上是因为我有这样的路由:
:controller/:foo/:bar
这里的:foo
是类似于可能包含斜杠的路径。我认为最直接的方法是URL转义foo
,这样斜杠就会被路由机制忽略。但现在我有疑虑了,很明显这些框架并不真正支持这样做,但根据RFC来说,这样做是错的吗?
下面是一些我收集到的信息:
RFC 1738 (URLs):
通常情况下,当一个八位字节被表示成字符时,它的解释也是相同的,当它被编码时也是如此。然而,对于保留字符来说,这个规则是不适用的:编码一个为特定协议保留的字符可能会改变URL的语义。
RFC 2396 (URIs):
这些字符被称为“保留字符”,因为它们在URI组件中的使用仅限于其保留目的。如果URI组件的数据与保留目的冲突,则必须在形成URI之前对冲突的数据进行转义。
(这里的转义是否意味着除了编码保留字符之外的其他操作?)
RFC 2616 (HTTP/1.1):
除了“保留”和“不安全”字符集(请参见RFC 2396 [42])中的字符外,其他字符等同于它们的“
%
HEX HEX”编码。
对于Rails,这里还有一个bug报告,他们似乎期望编码后的斜杠行为不同:
没错,我预计会得到不同的结果,因为他们指向不同的资源。
它正在根目录下查找文字文件
foo/bar
。未转义版本正在查找目录foo
中的文件bar
。
从RFC来看,原始与编码是相当于非保留字符,但保留字符的情况如何呢?