包含方案但不包含权限(主机名)的 URL?

leo*_*loy 6 url https

从 URL(通常是主机名)中省略“权限”组件但指定方案(通常http:https:)是否合法(和良好实践,并且得到很好的支持)?

例如,这些是有效的网址吗?

  https:login.html   (relative hostname and path)
  https:/auth/login.html   (relative hostname, absolute path)
Run Code Online (Sandbox Code Playgroud)

当然,预期的行为是使用当前的主机名 - 路径(相对)。

(顺便说一句,这假设//后方案是权限(主机)组件的一部分,我认为这是正确的解释)

动机是(常见)要求网站的某些页面通过 https 访问,其他页面通过 http 访问,我们希望使用相对 url 而不是绝对的(以在不同环境中进行测试)。

vbe*_*nce 6

根据RFC1738,双斜杠//是协议(方案)特定数据的一部分(因此根据本文档,它们不是强制性的)。

但是3.2.2中的HTTP协议(RFC2616)使双斜线成为方案的一部分,所以这是必须的。没有它们就没有有效的 HTTP URL。

来自 RFC2616 3.2.1:

HTTP 中的 URI 可以以绝对形式或相对形式表示 [...] 这两种形式的区别在于绝对 URI 始终以方案名称开头,后跟一个冒号。

...因此,如果您指定方案,则它已被视为绝对 URI。


Ian*_*oyd 5

根据RFC 3986

\n
    \n
  • 方案只能包含字母、数字和+.-
  • \n
  • 该机构是管理局//的一部分
  • \n
\n

所以:

\n
    \n
  • scheme:\xc2\xa0\xc2\xa0 //authority\xc2\xa0\xc2\xa0/path
  • \n
\n

这意味着

\n
https://stackoverflow.com/auth/login.html\n\\____/\\_________________/\\______________/\n   |          |                 |\nscheme    authority            path\n
Run Code Online (Sandbox Code Playgroud)\n

权限是可选,这意味着以下内容也有效:

\n
https:/auth/login.html\n\\____/\\______________/\n   |         |\nscheme      path\n
Run Code Online (Sandbox Code Playgroud)\n

RFC 指出了另一条规则:

\n
    \n
  • 如果省略Authority路径 不能以两个斜杠开头//
  • \n
  • 如果省略Authority路径不需要以/
  • \n
\n

总结:

\n
    \n
  • https://stackoverflow.com/auth/login.html (有效的)
  • \n
  • https:///auth/login.html (无效;当没有权限时,路径不能以 // 开头)
  • \n
  • https://auth/login.html (无效;当没有权限时,路径不能以 // 开头)
  • \n
  • https:/auth/login.html (有效的)
  • \n
  • https:auth/login.html (有效的)
  • \n
  • https:/login.html (有效的)
  • \n
  • https:login.html (有效的)
  • \n
  • https:/ (有效的)
  • \n
  • https: (有效的)
  • \n
\n

回答你的问题

\n
    \n
  • https:login.html: 是的
  • \n
  • https:/auth/login.html是的
  • \n
\n