4

For instance, using this code:

 $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" will not work, while $url = "http://www.upenn.edu" will work.

Without the www. the response code I get is 0, whereas with the www. it is 200.

If I were to use PHP get_headers("http://upenn.edu"), I would get two errors:

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

and

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

However, when I use the exact same code, http://google.com will work (as well as the expected http://www.google.com.)

Then, for a website such as http://www.dogpile.com, the www. part included returns a response code of 0 whereas without the www., I get a 302.

Why is this? and is there a better method to use in order to ensure reliable results (i.e., where a www. is not present, yet the response code is still returned?)

I am new to using cURL and dealing with headers and response codes, so any help is appreciated. Thank you.

4

4 回答 4

4

Not all domains treat www.domain.com and domain.com the same. Usually they do, but if you wanted to you could have two completely different websites on them.

Personally, I like to have all requests to www.mydomains.com redirected to the www-less version, but that's just my preference.

There is no realiable way of automatically detecting whether or not to use www.

于 2012-12-18T22:12:14.267 回答
3

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

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

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

大多数情况下不是使用数字,而是使用一些域名,google.com例如173.194.35.134.

所以告诉 curl 使用 URIhttp://google.com/将打开一个连接到

173.194.35.134:80

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

域名可以按层次组织。每个级别由一个点分隔.。所谓的顶级域 (TLD) 是最右边的部分,google.comcom. 然后分别是二级域(SLD)google。和www.google.com你有另一个域名,然后有三个级别。通常www称为子域

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

因此www.google.comgoogle.com可以是两个完全不同的东西。www子域只是在以SLD.TLD.

因此,通过这很常见,您可以尝试两者,看看哪一个有效。但是,我不会尝试更多 with and w/o www

于 2012-12-18T22:36:32.937 回答
1

这件事情是由很多原因导致的。

“0”状态表示您没有收到回复。这可能是因为:

  • url 不解析服务器(例如,如果您没有放置www但服务器期望它 - 正如 Kolink 所说,您不必在两者上都有网站)
  • 服务器没有响应(例如,url 可能会到达服务器,但网络服务器没有给您响应)
  • 服务器没有响应(可能是 dogpile 发生了什么;您没有传递适当的标头,所以它知道您是一台计算机而不是人类,所以只是直接将您弹回)

200 的状态意味着一切都很好。

3XX 状态一般表示搬家。使用 302,如果您阅读其余标题,您会发现该站点已移动到的 URL,建议您去那里。(注意,cUrl 可以自动处理重定向

您通常得到的其他值是 100(继续)、404(未找到)和 500(服务器错误),但实际上,服务器可以返回任何内容。包括418“我是一个小茶壶”。(http://tools.ietf.org/html/rfc2324)

更多阅读:

于 2012-12-18T22:24:35.317 回答
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 设置。

于 2012-12-18T22:39:09.487 回答