レスポンスヘッダービューア

アドレスを入力すると、サーバーがページを送る前に伝えている内容を読めます。途中のリダイレクトも含め、ステータス行と各ヘッダーを表示します。ヘッダーごとに、それが何のためにあるのかを短く添えています。

公開されている http:// または https:// のアドレスなら何でも可。スキームを省くとHTTPSを使います。

例: github.com, wikipedia.org

ウェブページの目に見えない部分

ウェブサーバーからのレスポンスは小包のような作りです。ページは箱の中身です。外側にはラベルが貼られていて、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ブラウザのどの保護機能が有効か
CookieSet-Cookieブラウザに何を覚えさせるか
クロスオリジンAccess-Control-Allow-Origin他サイトのスクリプトがこれを読めるか
接続Alt-Svc, Date, Keep-Aliveサーバーとの接続がどう管理されているか
サーバーとCDNServer, 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 がなければキャッシュは各ブラウザの推測任せになり、セキュリティヘッダーがなければ任意の保護機能は無効のままです。