Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将URL规范化为完全相同的表单_Php_Url - Fatal编程技术网

Php 将URL规范化为完全相同的表单

Php 将URL规范化为完全相同的表单,php,url,Php,Url,我想对照列表检查URL,以选择处理(这将查看数据流,而不是应用程序中的路由器),但HTTP使以多种不同方式表示同一URL变得非常容易,例如(改编自rfc 2616): 它们都表示相同的目标资源 我希望该设施将URL转换为规范形式 主机名大小写保持一致 支持不是方案、用户名、密码、端口、路径、查询和片段的完整元组的URL 明智地处理隐式端口和显式端口号 结果URL ascii编码,扩展为%。。。。适当情况下的顺序 在路径中合理地处理“/”和“../” 可以选择一致地对查询中的变量进行排序 有没

我想对照列表检查URL,以选择处理(这将查看数据流,而不是应用程序中的路由器),但HTTP使以多种不同方式表示同一URL变得非常容易,例如(改编自rfc 2616):

它们都表示相同的目标资源

我希望该设施将URL转换为规范形式

  • 主机名大小写保持一致
  • 支持不是方案、用户名、密码、端口、路径、查询和片段的完整元组的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>"; 
}