我正在尝试在我的网站中实现 google 登录,该网站使用Google Client API用 Symfony2 编写。我按照这里的说明进行操作,但是当我调用 $client->authenticate($code); 命令抛出异常告诉:
无法连接到 www.googleapis.com 端口 443:网络无法访问
有什么问题?
5 回答
解决方案 2(来自更新)。它似乎是 ipv6 接口和 php 卷曲的一些错误,所以另一个解决方案是在 curl 函数中设置适当的选项,以便在你的 php 脚本中使用 ipv4 连接到远程服务器
curl_setopt($curl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
解决方案 1。
我也遇到了同样的情况(通过将 ip v4 和主机名添加到 /etc/hosts 文件来解决),正如@hans-z 在另一个答案评论中指出的那样,我尝试使用下一个命令来验证网络问题。
curl -v https://www.googleapis.com
原来这是随机的,10 次尝试中只有 1 次 curl 命令可以连接到服务器,响应类似于:(“La red es inaccesible”在英文中的意思是“network unreachable”:))
$ curl -v https://www.googleapis.com
* Rebuilt URL to: https://www.googleapis.com/
* Hostname was NOT found in DNS cache
* Trying 64.233.186.95...
* Trying 2800:3f0:4003:c00::5f...
* connect to 2800:3f0:4003:c00::5f port 443 failed: La red es inaccesible
* Failed to connect to www.googleapis.com port 443: La red es inaccesible
* Closing connection 0
curl: (7) Failed to connect to www.googleapis.com port 443: La red es inaccesible
成功的回应是:
curl -v https://www.googleapis.com
* Rebuilt URL to: https://www.googleapis.com/
* Hostname was NOT found in DNS cache
* Trying 64.233.186.95...
* Trying 2800:3f0:4003:c00::5f...
* Connected to www.googleapis.com (64.233.186.95) port 443 (#0)
* successfully set certificate verify locations:
* CAfile: none
CApath: /etc/ssl/certs
* SSLv3, TLS handshake, Client hello (1):
* SSLv3, TLS handshake, Server hello (2):
* SSLv3, TLS handshake, CERT (11):
* SSLv3, TLS handshake, Server key exchange (12):
* SSLv3, TLS handshake, Server finished (14):
* SSLv3, TLS handshake, Client key exchange (16):
* SSLv3, TLS change cipher, Client hello (1):
* SSLv3, TLS handshake, Finished (20):
* SSLv3, TLS change cipher, Client hello (1):
* SSLv3, TLS handshake, Finished (20):
* SSL connection using ECDHE-RSA-AES128-GCM-SHA256
* Server certificate:
* subject: C=US; ST=California; L=Mountain View; O=Google Inc; CN=*.storage.googleapis.com
* start date: 2015-04-08 14:12:01 GMT
* expire date: 2015-07-07 00:00:00 GMT
* subjectAltName: www.googleapis.com matched
* issuer: C=US; O=Google Inc; CN=Google Internet Authority G2
* SSL certificate verify ok.
> GET / HTTP/1.1
> User-Agent: curl/7.35.0
> Host: www.googleapis.com
> Accept: */*
>
< HTTP/1.1 404 Not Found
< Cache-Control: no-cache, no-store, max-age=0, must-revalidate
< Pragma: no-cache
< Expires: Fri, 01 Jan 1990 00:00:00 GMT
< Date: Tue, 21 Apr 2015 21:38:12 GMT
< Vary: X-Origin
< Content-Type: text/html; charset=UTF-8
< X-Content-Type-Options: nosniff
< X-Frame-Options: SAMEORIGIN
< X-XSS-Protection: 1; mode=block
* Server GSE is not blacklisted
< Server: GSE
< Alternate-Protocol: 443:quic,p=1
< Accept-Ranges: none
< Vary: Origin,Accept-Encoding
< Transfer-Encoding: chunked
<
* Connection #0 to host www.googleapis.com left intact
奇怪的消息是“在 DNS 缓存中找不到主机名”,我使用的是 google DNS 的 4.4.4.4 和 8.8.8.8,所以我使用 curl 命令输出中的 ipv4 将该域添加到了我的 /etc/hosts 文件中解决了。
#/etc/hosts
...
64.233.186.95 www.googleapis.com
#DONT COPY THIS IP, USE THE ONE FROM YOUR CURL OUTPUT
...
看起来像是传出的防火墙/代理/网络问题。您应该能够验证使用ping
和curl
从您的网站运行的机器。
如果您的网络在代理下。您应该设置代理 url 和端口
curl_setopt($ch, CURLOPT_PROXY, "http://url.com"); //your proxy url
curl_setopt($ch, CURLOPT_PROXYPORT, "80"); // your proxy port number
这解决了我的问题
试试这个 echo ipv4 >> ~/.curlrc。它对我有用。
有同样的问题 - 问题在于 dns 解析,就像 le0diaz 的回答中提到的那样。
在 ubuntu 16.04 上,我们可以通过更改 /etc/gai.conf、更改 IPv6 的优先级、取消注释以下行来解决它:优先级 ::ffff:0:0/96 100