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

2017-09-04 08:55:30 +08:00
 Reign

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

6982 次点击
所在节点    程序员
33 条回复
zjp
2017-09-04 11:27:09 +08:00
@Tink
@doubleflower 对于主机不是吗,请求 v2ex.com → 响应 301
跳转 v2ex.com/
suyingtao
2017-09-04 12:20:42 +08:00
@zjp 这得看服务器的配置啊
Showfom
2017-09-04 12:43:32 +08:00
严格来说都是不规范的
doubleflower
2017-09-04 12:51:49 +08:00
@zjp 你知道 HTTP 协议头吗?看看第一行,你说的这种情况不可能的,必需要有个 path,如果是根就是 / 而不是空白。

@suyingtao 和服务器配置无关,HTTP 没办法不发送一个空路径。
zjp
2017-09-04 13:50:54 +08:00
@suyingtao 发现我搞混了,可能会做 301 跳转的是 path,请求根必须带"/"
lonelinsky
2017-09-04 15:00:05 +08:00
@aleung 是 3986,不是 3968, 我锁搜出来怎么不对呢 =。=

https://tools.ietf.org/html/rfc3986#page-16
FrankFang128
2017-09-04 15:01:12 +08:00
看 RFC 的事情,非要发帖。。。
mozutaba
2017-09-04 15:17:42 +08:00
补齐了。。。
zhicheng
2017-09-04 17:08:51 +08:00
@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
2017-09-04 17:59:12 +08:00
@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
2017-09-04 18:05:36 +08:00
@zhicheng 好吧,hsegment 是可以为空的,所以 hpath 也可以为空,第二个确实可以的。
aleung
2017-09-04 21:34:31 +08:00
@weyou 按照 rfc1738, hpath 是可以为空,但是前面的斜杠也不能没有啊,否则就不能出现 search,确实是不合法。
weyou
2017-09-04 22:23:10 +08:00
@aleung 所以说在 rfc1738 下,第一种是非法的,而第二种是合法的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/387933

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX