首页 > 解决方案 > http://8 --> http://0.0.0.8 是标准约定吗?

问题描述

今天我发现命令:

php -S 0:8888

在 localhost 上启动一个服务器,就像:

php -S 0.0.0.0:8888

此外,将 Safari 导航到:

http://8

将重定向到:

http://0.0.0.8

另外,我发现 Safari 会以其他方式重定向http://1.2http://1.2.3


是否有任何记录在案的标准或约定可以解释这一点,或者我是否在两个不同的软件中找到了类似的复活节彩蛋?

标签: phpipip-address

解决方案


不是官方官方,但它是一个非常接近的 RFC 草案。它没有定义这种行为,但它提到了它并使其合法化。

与此同时,一种非常流行的 IP 网络实现朝着自己的方向发展。4.2BSD 引入了一个函数 inet_aton(),它的工作是将字符串解释为 IP 地址。它解释了 [MTP] 中提到的两种语法(见上文):给出整个 32 位地址的单个数字和点分隔的八位字节值。它还解释了两种中间语法:用于 B 类地址的 octet-dot-octet-dot-16bits 和用于 A 类地址的 octet-dot-24bits。它还允许在如何指定单个数字部分方面具有一定的灵活性:除了十进制之外,它还允许使用八进制和十六进制,通过使用包含前缀“0”或“0x”的 C 语言语法来区分这些基数,并允许数字是任意长。

4.2BSD inet_aton() 已被广泛复制和模仿,因此是 IPv4 地址文本表示的事实上的标准。尽管如此,这些替代语法现在已经不再使用(如果它们曾经有过重要用途)。他们现在看到的唯一实际用途是故意混淆地址:将 IPv4 地址作为单个 32 位十进制数提供给希望隐藏在 URL 中编码的真实位置的人的青睐。除十进制八位字节之外的所有形式都被视为非标准形式(尽管可广泛互操作)且不可取。

https://datatracker.ietf.org/doc/html/draft-main-ipaddr-text-rep-02


而且,我们可以看到这段代码至今仍然存在:

给出整个 32 位地址的单个数字

❱ ping 2321319336
PING 2321319336 (138.92.133.168): 56 data bytes
...

octet-dot-octet-dot-16bits,用于 B 类地址

❱ ping 172.16.2342
PING 172.16.2342 (172.16.9.38): 56 data bytes
....

octet-dot-24bits,用于 A 类地址

❱ ping 10.45253
PING 10.45253 (10.0.176.197): 56 data bytes
...

请注意,RFC 3896 将 URI 中的 IP 地址明确定义为点分四进制十进制表示,因此从技术上讲,这些快捷方式根本不允许在 URI 中使用!


推荐阅读