• 请不要在回答技术问题时复制粘贴 AI 生成的内容
Reign
V2EX  ›  程序员

URL 规范中,问号前面是否要添加斜杠?

  •  
  •   Reign · Sep 4, 2017 · 7800 views
    This topic created in 3187 days ago, the information mentioned may be changed or developed.

    一个动态的网址,比如: https://www.v2ex.com?page=2 以及 https://www.v2ex.com/?page=2 这两种网址哪个才是最标准规范的 URL 形式?

    33 replies    2017-09-04 22:23:10 +08:00
    yulitian888
        1
    yulitian888  
       Sep 4, 2017
    scheme:[//[user[:password]@]host[:port]][/path][?query][#fragment]
    jhaohai
        2
    jhaohai  
       Sep 4, 2017 via iPhone
    如果是根的话需要加的吧
    0ZXYDDu796nVCFxq
        3
    0ZXYDDu796nVCFxq  
       Sep 4, 2017 via iPhone
    第一种不合法
    yemoluo
        4
    yemoluo  
       Sep 4, 2017 via iPad
    可以不加
    torbrowserbridge
        5
    torbrowserbridge  
       Sep 4, 2017
    就算不是根,加与不加也是不一样的。例如:/news/?page=1 与 /news?page=1
    FanWall
        6
    FanWall  
       Sep 4, 2017 via Android
    第二种
    我觉得第一种的请求成功是因为浏览器自动补齐成第二种(抓包就会发现)
    以前遇到类似的,第一种的 url 用 WinhttpCrackUrl 解析的话直接报 invalid
    zjsxwc
        7
    zjsxwc  
       Sep 4, 2017
    服务端可以区别,url 是""还是"/"来提供不同的内容。 所以 /something 与 /something/ 是 2 个不同的地址
    canbingzt
        8
    canbingzt  
       Sep 4, 2017
    @torbrowserbridge 确实,java 里可以通过 @RequestMapping("")和 @RequestMapping("/")测试
    weyou
        9
    weyou  
       Sep 4, 2017 via Android   ❤️ 4
    其实 2 种都不规范,只是浏览器做了兼容。rfc1738:
    HTTP
    httpurl = "http://" hostport [ "/" hpath [ "?" search ]]
    hpath = hsegment *[ "/" hsegment ] hsegment = *[ uchar | ";" | ":" | "@" | "&" | "=" ] search = *[ uchar | ";" | ":" | "@" | "&" | "=" ]
    aleung
        10
    aleung  
       Sep 4, 2017 via Android
    @weyou 如果是这样,RFC1738 有局限性了:一定要有 hpath,search 才能存在?
    weyou
        11
    weyou  
       Sep 4, 2017 via Android
    @aleung rfc 是这样的规定,但是各大浏览器也没有按照这个做,即使没有 hpath 不一样也可以么加 search 么。
    aleung
        12
    aleung  
       Sep 4, 2017   ❤️ 6
    @weyou RFC 1738 is updated by RFC 3968.

    ```
    3. Syntax Components

    The generic URI syntax consists of a hierarchical sequence of
    components referred to as the scheme, authority, path, query, and
    fragment.

    URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ]

    hier-part = "//" authority path-abempty
    / path-absolute
    / path-rootless
    / path-empty

    The scheme and path components are required, though the path may be
    empty (no characters). When authority is present, the path must
    either be empty or begin with a slash ("/") character. When
    authority is not present, the path cannot begin with two slash
    characters ("//"). These restrictions result in five different ABNF
    rules for a path (Section 3.3), only one of which will match any
    given URI reference.

    The following are two example URIs and their component parts:

    foo://example.com:8042/over/there?name=ferret#nose
    \_/ \______________/\_________/ \_________/ \__/
    | | | | |
    scheme authority path query fragment
    | _____________________|__
    / \ / \
    urn:example:animal:ferret:nose

    3.3 Path

    path = path-abempty ; begins with "/" or is empty
    / path-absolute ; begins with "/" but not "//"
    / path-noscheme ; begins with a non-colon segment
    / path-rootless ; begins with a segment
    / path-empty ; zero characters
    ```

    因此,https://www.v2ex.com?page=2 以及 https://www.v2ex.com/?page=2 这两种网址都符合规范。
    aleung
        13
    aleung  
       Sep 4, 2017
    还有,是否支持是看服务端,跟浏览器没有关系。
    anyforever
        14
    anyforever  
       Sep 4, 2017
    楼主得补点基础知识啊。
    aleung
        15
    aleung  
       Sep 4, 2017 via Android
    不好意思,输入错了,是 rfc 3986
    Mss
        16
    Mss  
       Sep 4, 2017
    不加斜杠请求会出现 301
    weyou
        17
    weyou  
       Sep 4, 2017 via Android
    @aleung 受教,刚才查的时候没发现还有个更新过的协议。
    doubleflower
        18
    doubleflower  
       Sep 4, 2017
    @Mss 搞笑吧
    zzNucker
        19
    zzNucker  
       Sep 4, 2017
    规范和实现一向差距挺远的
    Tink
        20
    Tink  
    PRO
       Sep 4, 2017 via iPhone
    @Mss 你在逗我
    zjp
        21
    zjp  
       Sep 4, 2017 via Android
    @Tink
    @doubleflower 对于主机不是吗,请求 v2ex.com → 响应 301
    跳转 v2ex.com/
    suyingtao
        22
    suyingtao  
       Sep 4, 2017 via iPhone   ❤️ 1
    @zjp 这得看服务器的配置啊
    Showfom
        23
    Showfom  
    PRO
       Sep 4, 2017 via iPhone
    严格来说都是不规范的
    doubleflower
        24
    doubleflower  
       Sep 4, 2017   ❤️ 1
    @zjp 你知道 HTTP 协议头吗?看看第一行,你说的这种情况不可能的,必需要有个 path,如果是根就是 / 而不是空白。

    @suyingtao 和服务器配置无关,HTTP 没办法不发送一个空路径。
    zjp
        25
    zjp  
       Sep 4, 2017 via Android
    @suyingtao 发现我搞混了,可能会做 301 跳转的是 path,请求根必须带"/"
    lonelinsky
        26
    lonelinsky  
       Sep 4, 2017
    @aleung 是 3986,不是 3968, 我锁搜出来怎么不对呢 =。=

    https://tools.ietf.org/html/rfc3986#page-16
    FrankFang128
        27
    FrankFang128  
       Sep 4, 2017
    看 RFC 的事情,非要发帖。。。
    mozutaba
        28
    mozutaba  
       Sep 4, 2017
    补齐了。。。
    zhicheng
        29
    zhicheng  
       Sep 4, 2017
    @weyou 第二种哪里不规范了?

    httpurl = "http://" hostport [ "/" hpath [ "?" search ]]

    hpath = hsegment *[ "/" hsegment ]

    hsegment = *[ uchar | ";" | ":" | "@" | "&" | "=" ]

    search = *[ uchar | ";" | ":" | "@" | "&" | "=" ]

    你发的 BNF,这个 '*' 是 匹配 0 个或多个的意思,hpath 是可以为空的。

    在 'www.example.com?' 和 'www.example.com/?' 是一样的,浏览器会自动补上 '/' 不然没办法构造请求。

    但对于其它路径不行,'www.example.com/hello' 和 'www.example.com/hello/' 是两个路径,有些 Web Server 会好心自动补上 '/' 或去掉 '/' 但有些不会。如果这两个路径表示的确实是同一个对象,服务器一般可以配置 URL rewrite 或把带 '/' 的 301 到不带 '/' 的路径上。
    weyou
        30
    weyou  
       Sep 4, 2017
    @zhicheng 首先应该参照 @aleung 说的 rfc3986, 我贴的 rfc1738 已经过时了。在 rfc3986 中这两种方式都是规范的。
    然后, 如果 hpath 是可以为空的, 那 BNF 应该是
    hpath = *[ "/" hsegment ]
    而不是
    hpath = hsegment *[ "/" hsegment ]
    这种方式代表至少有一个 hsegment. 后面的*代表 0 个或者多个[ "/" hsegment ]

    可以参照 rfc822 以及 rfc1738 中的说明:

    5. BNF for specific URL schemes

    This is a BNF-like description of the Uniform Resource Locator
    syntax, using the conventions of RFC822, except that "|" is used to
    designate alternatives, and brackets [] are used around optional or
    repeated elements. Briefly, literals are quoted with "", optional
    elements are enclosed in [brackets], and elements may be preceded
    with <n>* to designate n or more repetitions of the following
    element; n defaults to 0.
    weyou
        31
    weyou  
       Sep 4, 2017
    @zhicheng 好吧,hsegment 是可以为空的,所以 hpath 也可以为空,第二个确实可以的。
    aleung
        32
    aleung  
       Sep 4, 2017 via Android
    @weyou 按照 rfc1738, hpath 是可以为空,但是前面的斜杠也不能没有啊,否则就不能出现 search,确实是不合法。
    weyou
        33
    weyou  
       Sep 4, 2017 via Android
    @aleung 所以说在 rfc1738 下,第一种是非法的,而第二种是合法的
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5886 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 106ms · UTC 02:16 · PVG 10:16 · LAX 19:16 · JFK 22:16
    ♥ Do have faith in what you're doing.