こんにちはやまぱんです。
今回は Curl コマンドを使ってヘッダー情報を送ってみる検証をしてみます。
理解の足りない部分があるかもしれませんので、なにかコメントなどあったら是非お願いします!
前書き - きっかけ
WebサイトってCNAME経由のアクセスだったり、IPアドレス直打ちだったりすると正常に表示されないことがあってどうしてだろうと疑問に思ったことがきっかけです。
検証
対象 URL
-
www.google.com
皆さまご存知 goole です。 - www.google.az.yamapan.tokyo
こちらは検証用に用意したドメインです。
CNAME として www.google.com を設定しています。なので、通信の宛先としては同じです。
dig の結果
nslookuo の結果
用いるコマンド
今回用いるコマンドは "curl -I [URL]" と "curl -H \"ヘッダー名: ヘッダー値" -I [URL]" を使います。
- curl -I [URL]
curl -I コマンドは、コマンドラインツール "curl" を使用して指定したURLに対してHTTPのHEADリクエストを送信するために使用されます。このコマンドは、実際のコンテンツをダウンロードせずに、ウェブサーバーからのHTTPレスポンスのヘッダーを取得するためによく使われます。
- curl -H "ヘッダー名: ヘッダー値" -I [URL] "
-H オプションは、リクエストに含めるカスタムのHTTPヘッダーを指定するために使用され、-I オプションは、ウェブリソースのヘッダーを取得するためにHTTP HEADリクエストを送信するために使用されます。
それぞれの応答を確認
オプション -I のみで実施
「Curl -I」コマンドは、指定したURLにHTTPリクエストを送信し、HTTPヘッダー情報のみを表示します。HTTPヘッダーには、リクエストのステータスコード、サーバーの応答時間、コンテンツの長さ、Content-Typeなどが含まれます。
-
curl http://www.google.com/ -I
正常な応答 / HTTP Status Code : 200
- curl http://google.az.yamapan.tokyo/ -I
異常な応答 / HTTP Status Code : 404
オプション -I -H で実施
Curlの -H オプションは、HTTPリクエストヘッダーをカスタマイズするためのオプションです
-
curl http://www.google.com/ -I -H 'Host:www.google.com'
正常な応答 / HTTP Status Code : 200
- curl http://google.az.yamapan.tokyo/ -I -H 'Host:www.google.com'
正常な応答 / HTTP Status Code : 200
解説と考察
上記の結果から、
curl http://google.az.yamapan.tokyo/ -I
では正常な応答が返ってきませんが、
curl http://google.az.yamapan.tokyo/ -I -H 'Host:www.google.com'
とヘッダー情報を付けてあげると正常な応答がかえって来ていることが分かります。
(冒頭でも書いた通り、www.google.az.yamapan.tokyo は CNAME として www.google.com を設定しています。なので、通信の宛先としては同じです。)
この解説をします。
最初のコマンドはホストヘッダーを指定していないため、デフォルトのホストヘッダー(google.az.yamapan.tokyo)が使用されます。
その結果、サーバー側は「自分はgoogle.az.yamapan.tokyoではないよ!」と応答するため、リクエストしているWebページはないよと404エラーがでています。
次のコマンドでは オプション-H 'Host:www.google.com'で明示的にホスト情報を指定することで、サーバー側は「自分はwww.google.comだよ!どうぞこれ!」と応答するイメージです。
その結果正しくWebページが表示されます。
なぜ http://www.google.com を使ったのか
ここで小ネタを。
下記の4種類の URL どれにアクセスしても正しくWebページが表示されます。
http://www.google.com
http://google.com
https://www.google.com
https://google.com
では今回なぜ http://www.google.com を正常な宛先として使ったのかについて。
結論からいうと -H による挙動の動作検証の結果をわかりやすくするためです。
理由は以下です。
google.com ではなく、www.google.com を使った理由
試しに、google.com にアクセスしてみるとリダイレクトされてwww.google.com にアクセスします。
Curl -H してみます。
-
Curl -I http://www.google.com
正常な応答 / HTTP Status Code : 200 - Curl -I http://google.com
リダイレクトを示す応答 / HTTP Status Code : 301
HTTPステータスコードは301です。301は永続的なリダイレクトを示し、サーバーはリクエストされたURLを新しい場所にリダイレクトしています。この場合、http://google.comは新しい場所にリダイレクトされ、正しいウェブサイトにアクセスするための新しいURLが提供されている可能性があります。リダイレクトの目的は、トラフィックを新しい場所に誘導することです。
では次のコマンドを打ってみます。
-
Curl -I http://google.com -L
-L はリダイレクトを追うオプションです。 - Curl -I http://google.com -L
リダイレクトを示す応答 / HTTP Status Code : 301
のあとに
正常な応答 / HTTP Status Code : 200
が表示されていることが分かります。ブラウザでは自動でこれが行われているということですね。
https ではなく http を使った理由
Curl -I http://www.google.com
Curl -I https://www.google.com
これはどちらもリダイレクトを示す応答 / HTTP Status Code : 301を返します。
では CNAME である、www.google.az.yamapan.tokyo の https と http に対してcurl -I -H してみます。
-H を付けないとCNAME だと正常応答がかえって来ないことは既にわかっているのでホストヘッダーを -H で指定します。
-
Curl -I http://www.google.az.yamapan.tokyo -H 'Host:www.google.com'
正常な応答 / HTTP Status Code : 200
こちらは既に実施した通り、正しい応答が返ってきています。 - Curl -I https://www.google.az.yamapan.tokyo -H 'Host:www.google.com'
こちらは何やら証明書関連のエラーがでています。
このコマンドはエラーメッセージを返しおり、https/TLS(SSL)で用いられる SNI(Server Name Indication)または証明書のチェックでエラーが発生したことを示しています。
参考
Curl の主なオプション
-
-H
または--header
: HTTPヘッダーを指定します。
例:-H "Content-Type: application/json"
-
-X
または--request
: HTTPリクエストメソッドを指定します。
例:-X GET
または-X POST
-
-d
または--data
: HTTPリクエストにデータを追加します。
例:-d "key1=value1&key2=value2"
-
-o
または--output
: レスポンスをファイルに保存します。
例:-o response.txt
-
-i
または--include
: レスポンスヘッダーを表示します。 -
-u
または--user
: 認証情報を指定します。
例:-u username:password
-
-L
または--location
: リダイレクトをフォローします。 -k
または--insecure
: SSL証明書の検証を無効にします。
CNAME について
CNAME (Canonical Name) は、ドメインネームシステム(DNS)で使用される重要なリソースレコードの一つです。CNAME レコードは、特定のホスト名(ドメイン名)が別のホスト名にエイリアスされることを示します。つまり、CNAME レコードを設定することで、あるドメイン名を別のドメイン名に関連付けることができます。
CNAME レコードの主な用途は、ウェブサイトのドメイン名において、エイリアスやリダイレクトを設定することです。例えば、example.com ドメインを別のサーバーのホスト名に関連付けたい場合、CNAME レコードを使用して、example.com を新しいホスト名にリダイレクトできます。
CNAME レコードを設定すると、ドメイン名の変更が必要な場合に、1つの場所で変更を行うだけで済むため、管理が簡単になります。ただし、CNAME レコードを使用する際に注意すべき点もあります。たとえば、CNAME レコードを設定したドメイン名は、他のレコード(A レコードやMX レコードなど)と同時に設定できないことがあります。
HTTP StatusCode について
ステータスコードは、ウェブサーバーからのHTTPリクエストに対する応答として返される3桁の数字です。以下は一般的なHTTPステータスコードのざっくりとした一覧。
1xx - 情報
- 100: 継続
- 101: プロトコル切り替え
2xx - 成功
- 200: OK
- 201: 作成完了
- 204: 内容なし
3xx - リダイレクト
- 301: 恒久的に移動
- 302: 一時的に移動
- 304: 未更新
4xx - クライアントエラー
- 400: リクエストが不正
- 401: 認証が必要
- 403: アクセス拒否
- 404: ページが見つからない
5xx - サーバーエラー
- 500: サーバーエラー
- 502: 不正なゲートウェイ
- 503: サービス利用不可