【问题标题】:Youtube oEmbed API: 302, then 503 errorsYoutube oEmbed API:302,然后是 503 错误
【发布时间】:2014-09-28 20:00:23
【问题描述】:

我正在使用带有 Media Youtube 模块的 drupal 7。该模块调用 youtube oEmbed API。

这是模块将调用的 url 示例: http://www.youtube.com/oembed?url=https://www.youtube.com/watch?v=YZqqD1Rv5BI

在我的桌面上,这会返回一个 json 文件,一切正常。 但是在我网站的服务器上,我收到 503 服务不可用错误。 实际上我首先得到一个 302 not found,说 url 已经移动,然后是 503 错误:

这是我手动执行 wget 时得到的结果:

wget http://www.youtube.com/oembed?url=https://www.youtube.com/watch?v=YZqqD1Rv5BI
--2014-09-28 21:55:49--  http://www.youtube.com/oembed?url=https://www.youtube.com/watch?v=YZqqD1Rv5BI
Resolving www.youtube.com (www.youtube.com)... 2a00:1450:4007:808::1004, 173.194.40.131, 173.194.40.132, ...
Connecting to www.youtube.com (www.youtube.com)|2a00:1450:4007:808::1004|:80... connected.
HTTP request sent, awaiting response... 302 Found
Location: http://ipv6.google.com/sorry/IndexRedirect?continue=http://www.youtube.com/oembed%3Furl%3Dhttps://www.youtube.com/watch%3Fv%3DYZqqD1Rv5BI [following]
--2014-09-28 21:55:49--  http://ipv6.google.com/sorry/IndexRedirect?continue=http://www.youtube.com/oembed%3Furl%3Dhttps://www.youtube.com/watch%3Fv%3DYZqqD1Rv5BI
Resolving ipv6.google.com (ipv6.google.com)... 2a00:1450:4007:808::1008
Connecting to ipv6.google.com (ipv6.google.com)|2a00:1450:4007:808::1008|:80... connected.
HTTP request sent, awaiting response... 503 Service Unavailable
2014-09-28 21:55:49 ERROR 503: Service Unavailable.

任何帮助将不胜感激。 提前致谢

【问题讨论】:

标签: api drupal youtube drupal-7 oembed


【解决方案1】:

我遇到了同样的错误,但不幸的是,问题不在于模块(我将能够修复它并为模块维护者提交补丁)。

正如您已经测试过的那样,即使是简单的 wget 也会出现同样的问题,这源于它使用 IPv6 的事实。如果您可以强制通过 IPv4 处理对 youtube 的请求,问题将得到解决。但这只是一种变通方法,而不是真正的修复。

【讨论】:

  • 您好,感谢您的回复。这是我需要在服务器上进行的设置吗?还是我可以在 php 脚本中做的事情? (我怀疑第二种解决方案是否可行)。另外,你知道为什么请求是基于 ipv6 的吗?这是谷歌设置的吗?它在我的桌面上工作的事实是否意味着我的路由器处理 ipv4 中的请求?
  • 我也遇到了同样的问题。如何强制 curl 使用 IPv4?
【解决方案2】:

我找到了一种在 PHP 中强制 IPv4 DNS 解析的方法:

$url = 'http://www.youtube.com/oembed?format=json&url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DZVSd5aSXlQ0';
$c = curl_init();
curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($c, CURLOPT_URL, $url);
curl_setopt($c, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
$json = curl_exec($c);
$status = curl_getinfo($c,CURLINFO_HTTP_CODE);
curl_close($c);

这个解决方案实际上对我有用。

【讨论】:

  • Drupal 7 和 media_youtube 模块都使用 drupal_http_request 而不是 curl 来管理请求。 AFAIK,你不能用 drupal_http_request 做到这一点。
  • drupal 很可能不使用 curl 并且您无法轻松设置它,因为代码是低层的一部分。我必须修补一些外部库 (github.com/arnaud-lb/alb-oembed/pull/6) 才能在我的项目中修复它。
猜你喜欢
  • 2016-11-28
  • 2013-02-19
  • 2013-08-30
  • 1970-01-01
  • 1970-01-01
  • 2015-06-16
  • 2012-11-26
  • 2023-03-22
  • 1970-01-01
相关资源
最近更新 更多