这个开发的功能适用于任何服务器,但在app引擎中不起作用。 因为它有一个或多个功能,不会被谷歌应用引擎工作或导致问题。
任何解决方案?!!或任何其他选择?!!
/**
* get_redirect_url()
* Gets the address that the provided URL redirects to,
* or FALSE if there's no redirect.
*
* @param string $url
* @return string
*/
function get_redirect_url($url){
$redirect_url = null;
$url_parts = @parse_url($url);
if (!$url_parts) return false;
if (!isset($url_parts['host'])) return false; //can't process relative URLs
if (!isset($url_parts['path'])) $url_parts['path'] = '/';
$sock = fsockopen($url_parts['host'], (isset($url_parts['port']) ? (int)$url_parts['port'] : 80), $errno, $errstr, 30);
if (!$sock) return false;
$request = "HEAD " . $url_parts['path'] . (isset($url_parts['query']) ? '?'.$url_parts['query'] : '') . " HTTP/1.1\r\n";
$request .= 'Host: ' . $url_parts['host'] . "\r\n";
$request .= "Connection: Close\r\n\r\n";
fwrite($sock, $request);
$response = '';
while(!feof($sock)) $response .= fread($sock, 8192);
fclose($sock);
if (preg_match('/^Location: (.+?)$/m', $response, $matches)){
if ( substr($matches[1], 0, 1) == "/" )
return $url_parts['scheme'] . "://" . $url_parts['host'] . trim($matches[1]);
else
return trim($matches[1]);
} else {
return false;
}
}
答案 0 :(得分:1)
如果GAE端服务器在重定向中支持HEAD,应该正常 。
许多GAE应用程序在重定向中选择(或者更确切地说是默认)不支持HEAD,因为我认为在GAE上非常流行的其他非常棒的webapp2
开源轻量级框架中存在设计缺陷。
无论如何,如果你正在寻址的服务器在重定向中不支持HEAD,如果它在GAE上运行,则完全独立,如果它是否使用webapp2
,& c - 为什么它在重定向中不支持HEAD的根本原因根本不重要! - 我能想到的唯一解决方法是使用GET
代替(假设服务器确实正确支持GET
中的重定向,否则,我认为没有解决方案: - )。
是的,这是多么浪费(如果身体很大而你根本不关心它)。一个很好的选择是在https://chromium.googlesource.com/external/googleappengine/python/+/c06f40e29990868cc01795c88aeb0c42b8d9e395/lib/webapp2/AUTHORS处为webapp2
维护者列表提出补丁...
答案 1 :(得分:0)
原因很简单,免费应用引擎不支持fsockopen()函数, https://cloud.google.com/appengine/docs/php/sockets/
我已经在其他网站上看过这个。
所以我使用了这个功能,它可以正常工作
function getRedirectUrl ($url) {
stream_context_set_default(array(
'http' => array(
'method' => 'HEAD'
)
));
$headers = get_headers($url, 1);
if ($headers !== false && isset($headers['Location'])) {
return $headers['Location'];
}
return false;
}