4

たとえば、次のコードを使用します。

 $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")と、次の2つのエラーが発生します。

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に)機能します。

次に、などのWebサイトのhttp://www.dogpile.com場合、www.含まれている部分はの応答コードを返しますが、0ない場合はwww.、を取得し302ます。

どうしてこれなの?信頼できる結果を保証するために使用するより良い方法はありますか(つまり、awww.が存在しない場合でも、応答コードは返されますか?)

私はcURLを使用し、ヘッダーと応答コードを処理するのは初めてなので、助けていただければ幸いです。ありがとうございました。

4

4 に答える 4

4

すべてのドメインが同じように扱うわけではありませwww.domain.comdomain.com通常はそうですが、必要に応じて、2つのまったく異なるWebサイトを作成することもできます。

個人的には、すべてのリクエストをwww.mydomains.comwwwなしのバージョンにリダイレクトするのが好きですが、それは私の好みです。

使用するかどうかを自動的に検出する現実的な方法はありませんwww.

于 2012-12-18T22:12:14.267 に答える
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アドレスに解決します。

ドメイン名はレベルで整理できます。各レベルはドットで区切られ.ます。いわゆるトップレベルドメイン(TLD)は、最も右側の部分です。google.comつまり、ですcom。次に、セカンドレベルドメイン(SLD)がそれぞれgoogleです。そして、www.google.comあなたには別のドメイン名があり、3つのレベルがあります。これwwwは一般にサブドメインと呼ばれます。

ここで最も重要な部分は、ドメインごとにDNSシステムが異なるIPアドレスを返すことができるということです。

したがってwww.google.comgoogle.com2つのまったく異なるものになる可能性があります。サブドメインは、wwwで編成されたネットワーク上のWebサーバーに名前を付けるための一般的な規則にすぎませんSLD.TLD

したがって、これが一般的であるため、両方を試して、どちらが機能するかを確認できます。しかし、私はありとなし以上を試みることはありませんwww

于 2012-12-18T22:36:32.937 に答える
1

これには多くの理由があります。

「0」のステータスは、応答がなかったことを意味します。これは、次の理由で発生する可能性があります。

  • urlはサーバーを解決しません(たとえば、配置しないwwwがサーバーがそれを期待している場合-Kolinkが言うように、両方にWebサイトを持っている必要はありません)
  • サーバーが応答しません(たとえば、URLがサーバーに到達する可能性がありますが、Webサーバーは応答しません)
  • サーバーは何も応答しません(おそらく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レコードを設定することを怠っています。彼らがそうしているのは奇妙なことです(そして、ドメインのルートレベルでは持つことができないCNAMEに依存している彼らのCDNセットアップに関連している可能性があります)。

cURLとは何の関係もありません。upenn.eduのDNS設定だけです。

于 2012-12-18T22:39:09.487 に答える