php - 将 URL 标准化为相同形式的 PHP
问题描述
我想根据列表检查 URL 以做出有关处理的选择(这将查看数据流,而不是作为应用程序中的路由器)但是 HTTP 使得以许多不同的方式表示相同的 URL 变得非常容易,例如(改编自RFC 2616):
http://example.com/~smith/home.html
http://example.com:80/~smith/home.html
http://EXAMPLE.com/%7Esmith/home.html
http://EXAMPLE.COM/%7esmith/home.html
都代表相同的目标资源。
我希望该设施将 URL 转换为规范形式...
- 主机名大小写一致
- 支持不是方案、用户名、密码、端口、路径、查询和片段的完整元组的 URL
- 明智地处理隐式端口和显式端口号
- 生成的 URL ascii 编码,并在适当的情况下扩展 %.... 序列
- 明智地处理路径中的 './' 和 '../'
- 可选地对查询中的变量进行一致的排序
有没有一种简单的方法可以始终如一地做到这一点?
(看来这些parse_url()
都没有。)
解决方案
您可以使用glenscott/url-normalizer包进行符合规范 RFC 3986 的 URL 规范化。您可以在以下简单示例的帮助下查看规范化结果:
$urls = [
'http://example.com/~smith/home.html',
'http://example.com:80/~smith/home.html',
'http://EXAMPLE.com/%7Esmith/home.html',
'http://EXAMPLE.COM/%7esmith/home.html',
'https://example.com:443/~smith/home.html'
];
foreach ($urls as $url) {
$normalizer = new URL\Normalizer($url);
echo $normalizer->normalize(), "</br>";
}
结果:
http://example.com/~smith/home.html
http://example.com/~smith/home.html
http://example.com/~smith/home.html
推荐阅读
- arduino - Sim800L 时间没有更新到网络时间
- c++ - 无法使用 MinGW-w64 链接到 GLFW 3
- javascript - 数据更改时 DataTable 不更新
- apache-spark - 数据框的多维数据集/汇总功能,但跳过火花中少数记录的列的总和
- sql - 仅当表存在时才删除表,或忽略删除错误
- amazon-web-services - AWS 和 Terraform - 安全组中的默认出口规则
- javascript - 在 Angular 7 中将工厂方法从 AppModule 移动到 AppComponent
- typescript - 联合类型作为界面中的键?
- r - 长数据帧到存在/不存在矩阵
- mysql - MySql 分组优化 - 避免 tmp 表和/或文件排序