代码之家  ›  专栏  ›  技术社区  ›  user85509

斜杠(“/”)相当于HTTP URL路径部分中的编码斜杠(“%2F”)

  •  52
  • user85509  · 技术社区  · 16 年前

    我有一个站点对URL的路径部分(而不是查询字符串)中的“/”和“%2F”进行了不同的处理。根据RFC或现实世界,这是一件坏事吗?

    我问这个问题是因为我一直对我使用的web框架(RubyonRails)及其下面的层(Passenger,Apache,例如,我必须为Apache启用“ALLOW_ENCODED_SLASHES”)感到惊讶。我现在倾向于完全摆脱编码的斜杠,但我想知道我是否应该提交错误报告,在那里我看到涉及编码斜杠的奇怪行为。

    至于为什么我首先使用编码斜杠,基本上我有这样的路线:

    :controller/:foo/:bar
    

    其中:foo类似于可以包含斜杠的路径。我认为最简单的方法就是URL转义 foo

    以下是我收集的一些信息:

    RFC 1738(URL):

    通常,当八位字节由字符表示和编码时,URL具有相同的解释。但是,对于保留字符来说,情况并非如此:编码为特定方案保留的字符可能会更改URL的语义。

    RFC 2396(URI):

    这些字符称为“保留字符”,因为它们在URI组件中的使用仅限于保留用途。如果URI组件的数据与保留目的冲突,则必须在形成URI之前转义冲突的数据。

    (此处转义是否意味着对保留字符编码以外的内容?)

    “保留”和“不安全”集合中的字符(参见RFC 2396[42])以外的字符与其“%”十六进制编码等效。

    this bug report 对于Rails,它们似乎期望编码的斜杠表现不同:

    是的,我期望得到不同的结果,因为它们指向不同的资源。

    它正在根目录中查找文本文件“foo/bar”。非转义版本正在目录foo中查找文件栏。

    5 回复  |  直到 6 年前
        1
  •  36
  •   Zeograd    16 年前

    也就是说,如果您将apache与 mod_rewrite 但是,一旦适当的模块/cgi/。。。被调用来处理请求,则由它来执行解码,例如,检索包含斜杠的参数作为URI的第一个组件。

    如果应用程序使用这些数据检索文件(其文件名包含斜杠),这可能是一件坏事。

        2
  •  27
  •   Piotr Dobrogost    5 年前

    故事 %2F vs / 根据最初的报告,是这样吗 W3C recommendations ,斜杠 :

    斜杠(“/”,ASCII 2F十六进制)字符保留用于定界 关系为层次结构的子字符串的。这将启用部分 URI的形式。

    URI

    http://www.w3.org/albert/bertram/marie-claude

    和

    http://www.w3.org/albert/bertram%2Fmarie-claude

    与第二种情况相同,编码的斜杠不相同 具有等级意义。

        3
  •  10
  •   Hoytman    12 年前

    就我个人而言,我正在尽可能多地删除URL中的特殊字符。

    此外,我在URL中使用的id号不依赖于URL解码:

    变成:

    example.com/blog/12354/我的精彩博客%2fstory/昨天

    此外,请确保使用规范标记以确保url错误不会转化为重复内容。

        4
  •  4
  •   zhe liu    9 年前

    如果使用Tomcat,请在VM属性中添加“-Dorg.apache.Tomcat.util.buf.udeconder.ALLOW_ENCODED_SLASH=true”。

    https://tomcat.apache.org/tomcat-7.0-doc/config/systemprops.html#Security

        5
  •  2
  •   erik258    8 年前

    :foo 在其自然形式中包含斜杠?你不会希望的,不是吗 It specifically notes ,

    与unix和其他磁盘操作系统文件名约定的相似性应被视为纯粹巧合,而不应被视为表明URI应被解释为文件名。

    如果您正在构建备份程序的联机接口,并且希望将路径表示为URL路径的一部分,那么在文件路径中对斜杠进行编码是有意义的,因为这样做是正确的 不 实际上是资源层次结构的一部分,更重要的是 路线 . /backups/2016-07-28content//home/dan/ 在双斜杠中丢失文件系统的根。正如我所读到的,摆脱斜杠是区分的适当方式。

        6
  •  -2
  •   remjx    6 年前

    encodeURI() decodeURI 和 encodeURIComponent() / decodeURIComponent 是处理此问题的实用函数。在这里阅读更多 https://stackabuse.com/javascripts-encodeuri-function/

    推荐文章