web-dev-qa-db-ja.com

サーバーはHTTP応答ヘッダーをどのように設定しますか?

こんな簡単な質問をすると恥ずかしくなる気がしますが、何日も研究を続けており、役に立つ情報がありません。

サーバーが送信するHTTP応答ヘッダーを決定するものは何ですか?サーバーを制御する場合(具体性が必要な場合、たとえばApache)、応答ヘッダーを変更するためにどのファイルを編集できますか?たとえば、Content-Lengthの代わりにTransfer-Encoding: chunkedを含めるように設定するには?

PHPおよびJavaサーブレットを使用してヘッダーを操作できることは承知しています。ただし、応答ヘッダーの存在と内容はHTTPの基本であるため、外部のテクノロジーを使用せずにこれらを編集する方法が存在するはずですよね?

6
JonahHuron

特定のヘッダーは自動的に設定されます。それらはHTTP仕様の一部であり、サーバーがそれらを処理します。それがWebサーバーの目的であり、FTPサーバーやファイル共有などとは異なる理由です。たとえば、Content-LengthはWebサーバーによって簡単に計算され、サーバーがそれを実行するように設定する必要があります。

他の特定のヘッダーは、構成に基づいて設定されます。 Apacheは通常、メインの設定ファイル(httpd.confまたはApache2.confと呼ばれることが多い)をロードしますが、このファイルを保存するために、扱いにくい大きな混乱に陥り、その中から他のファイルをロードすることがよくあります。これらのファイルは、サーバーの動作を変更するための構成テキストの行を含む単なるテキストファイルです。他のWebサーバーはXML構成ファイルを使用し、構成を制御するためのGUIを備えている場合があります(IISなど)。

そのため、一部のヘッダーでは、ヘッダー値を明示的に設定しない場合がありますが、基本的にサーバーを構成し、その構成を使用して送信する適切なヘッダーを特定します。たとえば、特定のファイルをgzipで圧縮するようにサーバーを構成できます(たとえば、テキストファイルですが、すでに圧縮されているjpgは圧縮されていません)。 Apacheでは、これは mod_deflate module とそれが提供する設定オプションによって処理されます。適切な構成がサーバー構成に追加されると、サーバーは必然的に処理を実行し(たとえば、ファイルをgzipで圧縮するか、タイプに依存しない)、ヘッダーを自動的に追加します。したがって、Apacheモジュールは基本的にサーバーの動作を変更するものであり、これによってヘッダーも設定される場合とされない場合があります。もう1つの例は、キャッシュヘッダーを送信して、ファイルをキャッシュする期間をブラウザーに通知する場合です。これは、 mod_expiries module とそれが許可するすべての構成オプションを追加することによって制御されます。これらのヘッダーの一部はハードコーディングできますが(例:Cache-Control)、その他は計算を行うApacheに依存します(例:Expires)ので、構成に基づいてモジュールを使用してこれを行う方が適切です。

そして最後に、サーバーにヘッダーを明示的に設定できます(Apacheでは、これは mod_headers モジュールを使用して行われます)。これは、サーバーがヘッダーを追加するだけで、クライアント(Webブラウザーなど)がそれらの処理方法を認識しているブラウザー(HSTS、CSP、HPKPなど)に追加された新機能に役立ちます。たとえば、次の設定をhttpd.confに追加することで、JonahHuronヘッダーを追加できます。

Header always set JonahHuron "Some Value"

そのヘッダーが使用されるかどうかは、応答を受信するプログラムに完全に依存します。

10
Barry Pollard