将 URL 规范化为相同形式的 PHP

sym*_*ean 3 php url

我想根据列表检查 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
Run Code Online (Sandbox Code Playgroud)

都代表相同的目标资源。

我希望能够将 URL 转换为规范形式...

  • 主机名的情况要一致
  • 支持不是方案、用户名、密码、端口、路径、查询和片段的完整元组的 URL
  • 明智地处理隐式端口和显式端口号
  • 得到的 URL ascii 用 %.... 适当的扩展序列编码
  • 明智地处理路径中的 './' 和 '../'
  • 可选地对查询中的变量进行一致排序

有没有一种简单的方法可以始终如一地做到这一点?

(似乎这些parse_url()都没有。)

Max*_*rov 5

您可以使用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>"; 
}
Run Code Online (Sandbox Code Playgroud)

结果:

http://example.com/~smith/home.html

http://example.com/~smith/home.html

http://example.com/~smith/home.html

http://example.com/~smith/home.html

https://example.com/~smith/home.html