Php 将URL规范化为完全相同的表单
我想对照列表检查URL,以选择处理(这将查看数据流,而不是应用程序中的路由器),但HTTP使以多种不同方式表示同一URL变得非常容易,例如(改编自rfc 2616): 它们都表示相同的目标资源 我希望该设施将URL转换为规范形式Php 将URL规范化为完全相同的表单,php,url,Php,Url,我想对照列表检查URL,以选择处理(这将查看数据流,而不是应用程序中的路由器),但HTTP使以多种不同方式表示同一URL变得非常容易,例如(改编自rfc 2616): 它们都表示相同的目标资源 我希望该设施将URL转换为规范形式 主机名大小写保持一致 支持不是方案、用户名、密码、端口、路径、查询和片段的完整元组的URL 明智地处理隐式端口和显式端口号 结果URL ascii编码,扩展为%。。。。适当情况下的顺序 在路径中合理地处理“/”和“../” 可以选择一致地对查询中的变量进行排序 有没
- 主机名大小写保持一致
- 支持不是方案、用户名、密码、端口、路径、查询和片段的完整元组的URL
- 明智地处理隐式端口和显式端口号
- 结果URL ascii编码,扩展为%。。。。适当情况下的顺序
- 在路径中合理地处理“/”和“../”
- 可以选择一致地对查询中的变量进行排序
parse_url()
不执行这些操作。)您可以使用符合规范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>";
}
$url=[
'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($url作为$url){
$normalizer=新URL\normalizer($URL);
echo$normalizer->normalize(),“”;
}
结果是:
所以您希望将上述四个示例合并为一个Cannonical URI,因为它们实际上都指向一个相同的位置?考虑到术语“canonical”相对于HTTP的语义,它可能会让事情有些混乱-但是是的-我想对它们进行规范化。这并不困难,只是单调乏味。使用
parse_url
将url拆分为多个部分,使用strtolower
比较域名(或不区分大小写的匹配函数),使用harcode检查,如果没有暗示端口80
或443
的端口,则使用url\u decode
使比较正常化。。。顺便说一下,URL不一定区分大小写。也许在实践中主机部分是,但没有规则要求它成为主机部分case@apokryfos只有域名不区分大小写。例如,Apache是区分大小写的/thisIs.html
在许多情况下不是/thisIs.html
。没有,443它不是http。所以在这种情况下,它需要另一个url@Martin,否。您应该使用https方案。。。例如:http://example.com:443/~smith/home.html
-不会规范化为https,但https://example.com:443/~smith/home.html
将被删除normalized@Martin443是HTTPS的默认端口,但它只是端口号。它没有说明HTTPS的使用情况。例如,您可以使用443端口作为HTTP的端口,而不是默认端口。因此,您应该使用HTTPSscheme@MaximFedorov端口80也是如此。这个包看起来很酷,并说明了另一个要求:排序查询参数。启用此选项将按字母顺序对查询参数进行排序。
$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>";
}