host) || empty($siteurl->host)) { return false; } if ($keyurl->host == "*") { // * matches all return true; } // First match the host part. $keyparts = \array_reverse(\explode(".", $keyurl->host)); $siteparts = \array_reverse(\explode(".", $siteurl->host)); // Trim starting www from both parts, since site.domain and www.site.domain should be treated as the same. if (($x = \array_pop($keyparts)) != "www") {\array_push($keyparts, $x);} if (($x = \array_pop($siteparts)) != "www") {\array_push($siteparts, $x);} for ($i = 0; $i < count($keyparts); $i++) { // No match if the site does not have a part, but the key does. Unless the key part is * if (!isset($siteparts[$i]) ) { if ($keyparts[$i] != "*") { return false; } else { $i++; //increment $i by one before break, to make sure the comparison following this loop holds. break; // Stop comparison. Host part matches. } } // Now do a proper case insensitive check for matching. // Uses fnmatch to easily handle shell type wildcards. if ( ! \fnmatch($keyparts[$i], $siteparts[$i], \FNM_CASEFOLD)) { return false; } } // Fail if the site has a deeper subdomain than the key, unless the deepest key subdomain is * if ($keyparts[$i-1] != '*' && count($siteparts) > ($i)) { return false; } // If we made it here then the host part matches. Now check the path. // If path is /*, matches all subpaths including / $keypath = empty($keyurl->path) ? "/" : $keyurl->path; $sitepath = empty($siteurl->path) ? "/" : $siteurl->path; // Trim trailing / from both paths before comparison if (\strlen($sitepath) > 1) { $sitepath = \rtrim($sitepath, "/"); } if (\strlen($keypath) > 1) { $keypath = \rtrim($keypath, "/"); } // Do a case insensitive fnmatch on the site so wildcards are matched too. return \fnmatch($keypath, $sitepath, \FNM_CASEFOLD); } $tests = [ ["*", "https://www.miqra.nl"], ["*/*", "https://www.miqra.nl"], ["*", "https://clients.openedu.nl/fith"], ["clients.openedu.nl/fith", "https://clients.openedu.nl/fith/"], ["clients.openedu.nl/fith/", "https://clients.openedu.nl/fith"], ]; foreach($tests as $test) { [$key, $site] = $test; print("Checking key '{$key}' on site '{$site}': " . (sitematch($key, $site)?"MATCH":"FAIL") . "\n"); }