Я знаю, что эта проблема здесь, кажется, решена webbiedave, но у меня были свои проблемы с этим.
Первая проблема: закодированные символы нечувствительны к регистру. Таким образом, %C3 и %c3 — это один и тот же символ, хотя и разные как URI. Таким образом, оба URI указывают на одно и то же место.
Вторая проблема: папка% 20 (2) и папка % 20% 282% 29 оба являются допустимыми URL-адресами URI, которые указывают на одно и то же местоположение, хотя они являются разными URI.
Третья проблема: если я избавлюсь от символов, закодированных в URL-адресе, у меня будет два местоположения с одним и тем же URI, например bla%2Fblubb и bla/blubb.
Так что же делать? Чтобы сравнить два URI, мне нужно нормализовать их оба таким образом, чтобы я разделил их на все компоненты, urldecode все пути и части запросов за один раз, rawurlencode их и склеил обратно вместе, а затем я мог их сравнить.
И это может быть функция для его нормализации:
function normalizeURI($uri) {
$components = parse_url($uri);
$normalized = "";
if ($components['scheme']) {
$normalized .= $components['scheme'] . ":";
}
if ($components['host']) {
$normalized .= "//";
if ($components['user']) { //this should never happen in URIs, but still probably it's anything can happen thursday
$normalized .= rawurlencode(urldecode($components['user']));
if ($components['pass']) {
$normalized .= ":".rawurlencode(urldecode($components['pass']));
}
$normalized .= "@";
}
$normalized .= $components['host'];
if ($components['port']) {
$normalized .= ":".$components['port'];
}
}
if ($components['path']) {
if ($normalized) {
$normalized .= "/";
}
$path = explode("/", $components['path']);
$path = array_map("urldecode", $path);
$path = array_map("rawurlencode", $path);
$normalized .= implode("/", $path);
}
if ($components['query']) {
$query = explode("&", $components['query']);
foreach ($query as $i => $c) {
$c = explode("=", $c);
$c = array_map("urldecode", $c);
$c = array_map("rawurlencode", $c);
$c = implode("=", $c);
$query[$i] = $c;
}
$normalized .= "?".implode("&", $query);
}
return $normalized;
}
Теперь вы можете изменить функцию webbiedave на это:
function uriMatches($uri1, $uri2) {
return normalizeURI($uri1) === normalizeURI($uri2);
}
Это должно сработать. И да, это гораздо сложнее, чем даже мне хотелось.
person
Krassmus
schedule
22.01.2018