功能在谷歌应用引擎中不起作用

时间:2015-01-28 19:16:49

标签: google-app-engine

这个开发的功能适用于任何服务器,但在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;
    }

}

2 个答案:

答案 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;
}