Während der OP vermeiden cURL
wollte, ist es am besten, es zu benutzen, wenn es verfügbar ist. Hier ist eine Lösung, die die folgenden Vorteile
- verwendet curl für all schweres Heben, arbeitet so mit https
- meistert mit Servern, die niedrigen Rück verrohrten
location
Header-Namen (sowohl xaav und Webjay der Antworten nicht damit umgehen)
- können Sie steuern, wie tief du dich, bevor er aufgibt
hinwollen
Hier ist die Funktion:
function findUltimateDestination($url, $maxRequests = 10)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_NOBODY, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_MAXREDIRS, $maxRequests);
curl_setopt($ch, CURLOPT_TIMEOUT, 15);
//customize user agent if you desire...
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Link Checker)');
curl_setopt($ch, CURLOPT_URL, $url);
curl_exec($ch);
$url=curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);
curl_close ($ch);
return $url;
}
Hier ist eine ausführlichere Version, mit der Sie die Redirection-Kette überprüfen können, anstatt Curl folgen zu lassen.
function findUltimateDestination($url, $maxRequests = 10)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_NOBODY, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 15);
//customize user agent if you desire...
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Link Checker)');
while ($maxRequests--) {
//fetch
curl_setopt($ch, CURLOPT_URL, $url);
$response = curl_exec($ch);
//try to determine redirection url
$location = '';
if (in_array(curl_getinfo($ch, CURLINFO_HTTP_CODE), [301, 302, 303, 307, 308])) {
if (preg_match('/Location:(.*)/i', $response, $match)) {
$location = trim($match[1]);
}
}
if (empty($location)) {
//we've reached the end of the chain...
return $url;
}
//build next url
if ($location[0] == '/') {
$u = parse_url($url);
$url = $u['scheme'] . '://' . $u['host'];
if (isset($u['port'])) {
$url .= ':' . $u['port'];
}
$url .= $location;
} else {
$url = $location;
}
}
return null;
}
Als Beispiel für die Umleitung Kette, die diese Funktion übernimmt, aber die andere nicht, versuchen Sie dies:
echo findUltimateDestination('http://dx.doi.org/10.1016/j.infsof.2016.05.005')
Zum Zeitpunkt des Schreibens beinhaltet diese 4-Anfragen, mit einer Mischung aus Location
und location
Header beteiligt.
Es gibt * mehrere * 'Location:' Header in einer einzigen Antwort? – Tomalak
get_headers folgt Umleitungen automatisch von defualt, so bekomme ich mehrere 'Location:' Header. Was ich möchte, ist die vollständige finale URL (http: //domain.test/final/page.ext? Attr ...) – Weboide
Ich habe die Frage nicht verstanden :( – Stewie