为什么cURL有时需要“www”。要运行的URL的一部分,反之亦然?

时间:2012-12-18 22:10:06

标签: php curl http-headers http-response-codes

例如,使用此代码:

 $curl = curl_init();
 curl_setopt_array( $curl, array(
      CURLOPT_RETURNTRANSFER => true,
      CURLOPT_URL => "$url" ) );
 curl_exec( $curl );
 $header = curl_getinfo( $curl, CURLINFO_HTTP_CODE );
 curl_close( $curl );

$url = "http://upenn.edu"工作,而$url = "http://www.upenn.edu"将有效。

如果没有www.我得到的回复代码为0,而www.则为200

如果我使用PHP get_headers("http://upenn.edu"),我会收到两个错误:

  

Warning: get_headers() [function.get-headers]: php_network_getaddresses: getaddrinfo failed: nodename nor servname provided, or not known

  

Warning: get_headers(http://upenn.edu) [function.get-headers]: failed to open stream: php_network_getaddresses: getaddrinfo failed: nodename nor servname provided, or not known

但是,当我使用完全相同的代码时,http://google.com 工作(以及预期的http://www.google.com。)

然后,对于http://www.dogpile.com这样的网站,包含的www.部分会返回响应代码0,而不会 www.,我得到302

这是为什么?是否有更好的方法来确保可靠的结果(即,www.不存在,但仍然返回响应代码?)

我是新手使用cURL并处理标题和响应代码,所以任何帮助都表示赞赏。谢谢。

3 个答案:

答案 0 :(得分:4)

并非所有域都同等对待www.domain.comdomain.com通常他们会这样做,但是如果你愿意,你可以拥有两个完全不同的网站。

就个人而言,我希望将www.mydomains.com的所有请求重定向到无www版本,但这只是我的偏好。

没有可行的方法来自动检测是否使用www.

答案 1 :(得分:3)

你的问题,甚至因为现在使用卷曲而被问到,实际上是完全独立于卷曲的东西。其他客户端http库与这些示例相同,因为它与域名系统和计算机上运行的服务有关。

Curl是一个HTTP库。如果您执行HTTP请求,默认情况下您将尝试连接到远程计算机上的端口80.

远程计算机由IP地址标识。这是一个像173.194.35.134这样的数字 - 你可能已经知道了。

通常不使用数字,而是使用某些域名,例如google.com 173.194.35.134

告诉curl使用URI http://google.com/将打开与

的连接
173.194.35.134:80

域名系统会将域google.com解析为IP地址。

域名可以按级别组织。每个级别用点.分隔。对于google.com com,所谓的顶级域名(TLD)是右侧最重要的部分。二级域(SLD)分别为google。使用www.google.com,您有另一个域名,然后有三个级别。 www通常称为子域

这里最重要的部分是,对于每个不同的域,DNS系统都可以返回不同的IP地址。

因此www.google.comgoogle.com可能是两个完全不同的东西。 www子域只是在使用SLD.TLD组织的网络上命名网络服务器的常用约定。

因此,通过这种方式,您可以尝试两者并查看哪一个有效。但是,我不会尝试使用和{/ 1}}。

答案 2 :(得分:1)

$ dig upenn.edu

; <<>> DiG 9.8.3-P1 <<>> upenn.edu
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 54604
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;upenn.edu.         IN  A

;; Query time: 2 msec
;; SERVER: 10.0.1.1#53(10.0.1.1)
;; WHEN: Tue Dec 18 17:37:18 2012
;; MSG SIZE  rcvd: 27

$ dig www.upenn.edu

; <<>> DiG 9.8.3-P1 <<>> www.upenn.edu
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 10583
;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;www.upenn.edu.         IN  A

;; ANSWER SECTION:
www.upenn.edu.      123 IN  CNAME   www.upenn.edu-dscg.edgesuite.net.
www.upenn.edu-dscg.edgesuite.net. 4782 IN CNAME a1165.dscg.akamai.net.
a1165.dscg.akamai.net.  4   IN  A   208.47.254.80
a1165.dscg.akamai.net.  4   IN  A   208.47.254.83

;; Query time: 2 msec
;; SERVER: 10.0.1.1#53(10.0.1.1)
;; WHEN: Tue Dec 18 17:37:23 2012
;; MSG SIZE  rcvd: 141

宾夕法尼亚大学忽略了为其域名的非www变体设置DNS记录。奇怪的是他们已经这样做了(并且可能与他们的CDN设置有关,它依赖于CNAME,你可以为域的根级别拥有它。)

与cURL无关,只是upenn.edu的DNS设置。