php - 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.2和http://1.2.3。
是否有任何记录在案的标准或约定可以解释这一点,或者我是否在两个不同的软件中找到了类似的复活节彩蛋?
解决方案
不是官方官方,但它是一个非常接近的 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 中使用!
推荐阅读
- image - 如何设置颜色。颜色值?
- c - MSP430F5xxx RTOS 恢复上下文汇编器不清楚
- sql - 将 Select 语句结果保存到 Array Aurora Postgres
- python - 检查 python 脚本执行中没有使用哪些行
- python - 如何从 Python Pandas 中第二天的行中获取值?
- python - 发布请求结果不会附加到 python DataFrame
- python - 如何在 Paraview 中渲染一个简单的 2D vtkImageData 对象?
- ios - 如何使用 swift 制作正确的本地 JSON 文件和正确的模型
- javascript - 减速器之一没有被触发
- ios - 启用语音控制时未正确调用 EditActionsForRowAt