レスポンスヘッダービューア
アドレスを入力すると、サーバーがページを送る前に伝えている内容を読めます。途中のリダイレクトも含め、ステータス行と各ヘッダーを表示します。ヘッダーごとに、それが何のためにあるのかを短く添えています。
ウェブページの目に見えない部分
ウェブサーバーからのレスポンスは小包のような作りです。ページは箱の中身です。外側にはラベルが貼られていて、3桁のステータスコードを含む最初の行と、ヘッダーと呼ばれる Name: value 形式の行の並びでできています。ブラウザはまずラベルを読み、ほとんどすべてをそこで決めます。表示するかダウンロードするか、コピーを保存するか、別の場所へ移動するか、どのCookieを保存するか、などです。
ヘッダーは画面に表示されないので、不可解な動作の原因がよくそこに隠れています。更新されないページ、ループするリダイレクト、別ドメインでブロックされるフォント、保持されないログイン。たいていは、一つのヘッダーの値が間違っているだけです。
このビューアがしていること
当サーバーは、入力されたアドレスに GET リクエストを一回送ります。ブラウザが送るのと同じ種類のリクエストで、その応答を記録します。応答がリダイレクト(Location ヘッダー付きの3xxステータス)なら、新しいアドレスにもリクエストして記録します。最大8回までです。レスポンスごとに一つのブロックが順番に表示されるので、どの段階でどのサーバーがどのヘッダーを付けたかがわかります。
各ヘッダーは130以上の名前を収めた辞書で調べ、分類と一文の解説を添えて表示します。分類は次のとおりです。
| 分類 | 代表的なヘッダー | 答えてくれる問い |
|---|---|---|
| キャッシュ | Cache-Control, ETag, Age, X-Cache | 保存してよいか、どれくらいの期間か、キャッシュが応答したか |
| コンテンツ | Content-Type, Content-Encoding, Content-Length | 本文に何が入っていて、どう圧縮されているか |
| セキュリティ | Strict-Transport-Security, Content-Security-Policy | ブラウザのどの保護機能が有効か |
| Cookie | Set-Cookie | ブラウザに何を覚えさせるか |
| クロスオリジン | Access-Control-Allow-Origin | 他サイトのスクリプトがこれを読めるか |
| 接続 | Alt-Svc, Date, Keep-Alive | サーバーとの接続がどう管理されているか |
| サーバーとCDN | Server, Via, CF-RAY, X-Served-By | どのソフトウェア、どのネットワークが応答したか |
| 診断 | Server-Timing, X-Request-Id | どれくらい時間がかかったか、ログでどう探すか |
辞書にない名前は、独自または珍しいヘッダーとして表示します。どのソフトウェアも自由に独自ヘッダーを作れるので、この表示はよく目にしますが、害はありません。時間やサイズは役に立つ場合に変換するので、max-age=31536000 は365日と表示されます。
概要には、最終ステータス、当サーバーが使ったHTTPバージョン、リダイレクトの回数、Server ヘッダーが示すソフトウェア、最後のレスポンスのヘッダー数が出ます。ここでは採点はしません。点数がほしい場合はセキュリティヘッダーの評価をどうぞ。
ステータス行の読み方
- 2xx:リクエストは成功しました。
200がふつうのケースです。 - 301と308:恒久的な移転です。ブラウザと検索エンジンは新しいアドレスを覚えます。302、303、307:今はそちらへ行き、元のアドレスを基準として残します。
- 4xx:サーバーが拒否したか、求められたものが見つかりません。ブラウザでは普通に開くページで
403が出る場合、サイトが自動リクエストをブロックしていることがよくあります。 - 5xx:サーバー自体が失敗しました。
520から526のコードは、背後のサーバーに到達できなかったCDNが返すものです。
よく確認される4つのこと
- 「訪問者にまだ古い版が表示されるのはなぜ?」
Cache-ControlとAgeを見てください。HTMLページに長いmax-ageが付いていると、期限が切れるまでブラウザは再確認しません。X-CacheやCF-Cache-StatusがHITなら、CDNが自分のコピーを返しているので、パージが必要です。- 「圧縮は有効?」
Content-Encoding: br、gzip、zstdを探してください。HTMLページにこのヘッダーがなければ、ページは元のサイズのまま送られています。- 「このリダイレクトはどこから?」
- 各段階の
Serverヘッダーを比べてください。CDNが応答したリダイレクトは、CDNの管理画面で設定されたものです。nginxやApacheが応答したものはサーバー設定にあります。X-Redirect-Byが付いていれば、それを出したアプリケーションやプラグインの名前がわかります。 - 「このサイトは何で動いている?」
Server、X-Powered-By、Viaには、ウェブサーバー、言語、CDNの名前がよく出ています。自分のサイトなら、これらのヘッダーからバージョン番号を消しておく価値があります。
表示されているのは、匿名のリクエスト一回に対して当サーバーが受け取ったヘッダーです。ログイン中の訪問者、モバイルブラウザ、別の国、別の Accept-Language には、サイトが違う応答を返すことがあります。ヘッダー名は一般的な表記で表示しています。HTTP/2とHTTP/3では、生データのブロックと同じく小文字で送られますが、大文字小文字は意味を持ちません。
よくある質問
自分のブラウザでレスポンスヘッダーを見るには?
開発者ツールを開き(F12、MacならCmd+Option+I)、ネットワークタブに移ってページを再読み込みし、最初のリクエストをクリックします。ヘッダーパネルに同じ行が表示されます。このビューアは、それができないときのためのものです。スマートフォンで見るとき、開きたくないリンクを調べるとき、Cookieを持たないクライアントへの応答を見たいときなどです。
リクエストヘッダーとレスポンスヘッダーの違いは?
リクエストヘッダーは、ブラウザの問い合わせと一緒に送られます。どのページか、どの言語や形式を受け付けるか、どのCookieを持っているかなどです。レスポンスヘッダーは、サーバーから答えと一緒に返ってきます。このページに表示されるのはレスポンスヘッダーだけです。
X-で始まるヘッダーは標準ですか?
X- という接頭辞は、非公式なヘッダーのための慣習でした。それでも X-Frame-Options や X-Content-Type-Options のように、広く使われるようになったものもあります。この慣習は2012年に廃止されたので、新しい独自ヘッダーには接頭辞がないことがよくあります。
ブラウザに表示されるヘッダーと違うのはなぜ?
同じリクエストではないからです。サーバーやCDNは、クライアントのユーザーエージェント、Cookie、言語、場所に合わせて応答を変えます。また、キャッシュされたコピーには何時間も前に作られたヘッダーが付いていることがあります。Vary ヘッダーには、サーバーが考慮するリクエストヘッダーが並んでいます。
ServerヘッダーとX-Powered-Byヘッダーは隠すべき?
製品名を隠しても大きな違いはありません。ただし、バージョン番号を消すのは2分でできるので、やる価値があります。自動スキャナーはこれを見て、試す既知の脆弱性を選ぶからです。nginxでは server_tokens off;、Apacheでは ServerTokens Prod、PHPでは expose_php = Off を使います。
ヘッダーがないのは問題があるということ?
たいていは違います。本文のあるほぼすべてのレスポンスに必要とされるのは Content-Type だけです。ほかのヘッダーは目的次第で重要になります。Cache-Control がなければキャッシュは各ブラウザの推測任せになり、セキュリティヘッダーがなければ任意の保護機能は無効のままです。