画像とテキストでHTTPヘッダーのあらゆる側面を理解する

画像とテキストでHTTPヘッダーのあらゆる側面を理解する

HTTPヘッダーとは

HTTP は「Hypertext Transfer Protocol」の略です。このプロトコルは World Wide Web 全体で使用されています。この記事のように、ブラウザに表示されるコンテンツのほとんどが http プロトコル経由で送信されます。

HTTP ヘッダーは HTTP リクエストとレスポンスの中核であり、クライアント ブラウザー、リクエストされたページ、サーバーなどの情報を伝えます。

ブラウザのアドレス バーに URL を入力すると、ブラウザは次のような HTTP リクエストを送信します。
GET /tutorials/other/top-20-mysql-best-practices/ HTTP/1.1
Host: net.tutsplus.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Cookie: PHPSESSID=r2t5uvjq435r4q7ib3vtdjq120
Pragma: no-cache
Cache-Control: no-cache

最初の行は「リクエスト ライン」と呼ばれ、リクエストの基本情報を記述します。残りは HTTP ヘッダーです。

リクエストが完了すると、ブラウザは次の HTTP 応答を受信する場合があります。

HTTP/1.x 200 OK
Transfer-Encoding: chunked
Date: Sat, 28 Nov 2009 04:36:25 GMT
Server: LiteSpeed
Connection: close
X-Powered-By: W3 Total Cache/0.8
Pragma: public
Expires: Sat, 28 Nov 2009 05:36:25 GMT
Etag: "pub1259380237;gz"
Cache-Control: max-age=3600, public
Content-Type: text/html; charset=UTF-8
Last-Modified: Sat, 28 Nov 2009 03:50:37 GMT
X-Pingback: http://net.tutsplus.com/xmlrpc.php
Content-Encoding: gzip
Vary: Accept-Encoding, Cookie, User-Agent
<!-- ... rest of the html ... -->

最初の行は「ステータス ライン」と呼ばれ、その後に http ヘッダーが続き、空白行の後に出力が始まります (この場合は、HTML 出力)。

ただし、ページ ソースを表示すると、HTTP ヘッダーは表示されません。ただし、表示可能な内容とともに HTTP ヘッダーがブラウザーに送信されます。

この HTTP リクエストは、画像、CSS ファイル、JS ファイルなどの他のリソースを受信するためのリクエストも送信します。

以下で詳細を見てみましょう。

HTTPヘッダーの表示方法

次の Firefox 拡張機能は、HTTP ヘッダーの分析に役立ちます。

1.放火魔

2.ライブHTTPヘッダー

3. PHPの場合:

  • getallheaders()はリクエスト ヘッダーを取得するために使用されます。$_SERVER 配列を使用することもできます。
  • headers_list()はレスポンス ヘッダーを取得するために使用されます。

この記事の下に、PHP を使用したいくつかの例を示します。

HTTP リクエスト構造

最初の行は「最初の行」と呼ばれ、次の 3 つの部分で構成されます。

  • 「メソッド」は、リクエストの種類を示します。最も一般的なリクエストの種類は、GET、POST、HEAD です。
  • 「パス」はホストの後のパスを指します。たとえば、「http://net.tutsplus.com/tutorials/other/top-20-mysql-best-practices/」をリクエストすると、パスは「/tutorials/other/top-20-mysql-best-practices/」になります。
  • 「プロトコル」には「HTTP」とバージョン番号が含まれており、最近のブラウザでは 1.1 が使用されます。

残りの行はそれぞれ「名前:値」のペアです。これらには、リクエストとブラウザに関するさまざまな情報が含まれています。たとえば、「User-Agent」は、使用しているブラウザのバージョンとオペレーティング システムを示します。 「Accept-Encoding」は、ブラウザが gzip などの圧縮された出力を受け入れることができることをサーバーに伝えます。

これらのヘッダーのほとんどはオプションです。 HTTP リクエストは次のように短縮することもできます。

GET /tutorials/other/top-20-mysql-best-practices/ HTTP/1.1
Host: net.tutsplus.com

そして、サーバーから有効な応答が引き続き受信されます。

リクエストタイプ

最も一般的な 3 つのリクエスト タイプは、GET、POST、HEAD です。最初の 2 つは、HTML を書いた経験からすでにご存知かもしれません。

GET: ドキュメントを取得する

ブラウザに送信される HTML、画像、JS、CSS などのほとんどは、GET メソッドを通じて要求されます。これはデータを取得するための主な方法です。

たとえば、Nettuts+ から記事を取得する場合、http リクエストの最初の行は通常次のようになります。

GET /tutorials/other/top-20-mysql-best-practices/ HTTP/1.1

HTML が読み込まれると、ブラウザは次のように GET リクエストを送信して画像を取得します。

GET /wp-content/themes/tuts_theme/images/header_bg_tall.png HTTP/1.1

フォームは GET メソッド経由で送信することもできます。次に例を示します。

<form action="foo.php" method="GET">
First Name: <input name="first_name" type="text" />
Last Name: <input name="last_name" type="text" />
<input name="action" type="submit" value="Submit" />
</form>

このフォームが送信されると、HTTP リクエストは次のようになります。

GET /foo.php?first_name=John&last_name=Doe&action=Submit HTTP/1.1
...

フォーム入力をクエリ文字列に追加することで、サーバーに送信できます。

POST: サーバーにデータを送信する

GET メソッドを使用して URL にデータを添付し、サーバーに送信することもできますが、多くの場合、POST を使用してサーバーにデータを送信する方が適切です。 GET 経由で大量のデータを送信することは現実的ではなく、一定の制限があります。

フォームデータを POST リクエストを使用して送信するのが一般的です。上記の例を POST を使用するように変更してみましょう。

<form action="foo.php" method="POST">
First Name: <input name="first_name" type="text" />
Last Name: <input name="last_name" type="text" />
<input name="action" type="submit" value="Submit" />
</form>

このフォームを送信すると、次のような HTTP リクエストが作成されます。

POST /foo.php HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://localhost/test.php
Content-Type: application/x-www-form-urlencoded
Content-Length: 43
first_name=John&last_name=Doe&action=Submit

ここで注意すべき点が 3 つあります。

  • 最初の行のパスは、クエリ文字列なしで単純に /foo.php になりました。
  • 送信される情報に関する情報を提供する Content-Type ヘッダーと Content-Length ヘッダーを追加しました。
  • すべてのデータは、クエリ文字列の形式でヘッダーの後に送信されます。

POST リクエストは、AJAX、アプリケーション、cURL などでも使用できます。また、すべてのファイルアップロードフォームでは POST メソッドを使用する必要があります。

HEAD: ヘッダー情報を受信する

HEAD は GET と非常によく似ていますが、HEAD は HTTP 応答のコンテンツ部分を受け入れないという点が異なります。 HEAD リクエストを送信すると、ドキュメント自体ではなく、HTTP ヘッダーのみに関心があることを意味します。

この方法により、ブラウザはページが変更されたかどうかを判断し、キャッシュを制御できます。要求された文書が存在するかどうかを判断することもできます。

たとえば、Web サイトに多数のリンクがある場合は、各リンクに HEAD リクエストを送信するだけで、壊れたリンクがあるかどうかを判断できます。これは、GET を使用するよりもはるかに高速です。

http レスポンス構造

ブラウザが HTTP リクエストを送信すると、サーバーは HTTP レスポンスでそのリクエストに応答します。内容を気にしない場合は、リクエストは次のようになります。

最初の貴重な情報はプロトコルです。現在、サーバーは HTTP/1.x または HTTP/1.1 を使用します。

次に、ステータスを示す短いメッセージが表示されます。コード 200 は、リクエストが正常に送信され、サーバーがヘッダー情報の後に要求したドキュメントを返すことを意味します。

私たちは皆、「404」ページを見たことがあります。サーバーに存在しないパスを要求すると、サーバーは 200 ではなく 404 で応答します。

応答コンテンツの残りの部分は、HTTP リクエストと同様です。これらは、サーバー ソフトウェア、ページ/ファイルが変更されたとき、MIME タイプなどに関するものです。

繰り返しますが、これらのヘッダーはオプションです。

HTTP ステータス コード

  • 200 はリクエストが成功したことを示すために使用されます。
  • 300 はリダイレクトを示します。
  • 400 はリクエストに問題があることを示すために使用されます。
  • 500 はサーバーの問題を示すために使用されます。

200 成功 (OK)

前述のように、200 はリクエストが成功したことを示すために使用されます。

206 部分的なコンテンツ

アプリケーションが特定の範囲内のファイルのみを要求する場合は、206 が返されます。

これは通常、ダウンロードの管理、ダウンロードの再開、またはファイルのチャンクでのダウンロードに使用されます。

404 見つかりません

404

わかりやすい

401 権限がありません

パスワードで保護されたページはこのステータスを返します。正しいパスワードを入力しないと、ブラウザに次のメッセージが表示されます。

401

これはパスワードで保護されたページであり、パスワードを要求するポップアップ ボックスは次のようになることに注意してください。

401_プロンプト

403 禁止

ページにアクセスする権限がない場合は、403 ステータスが返されます。これは通常、インデックス ページがないフォルダーを開こうとしたときに発生します。サーバー設定でディレクトリの内容の表示が許可されていない場合は、403 エラーが表示されます。

他の方法でも権限制限が送信されます。たとえば、IP アドレスでブロックできますが、これには htaccess の支援が必要です。

order allow,deny
deny from 192.168.44.201
deny from 224.39.163.12
deny from 172.16.7.92
allow from all

302 (または 307) は一時的に移動され、301 は永久的に移動されました

これら 2 つの状態は、ブラウザがリダイレクトされるときに表示されます。たとえば、bit.ly のような URL 短縮サービスを使用するとします。これは、リンクをクリックした人が誰であるかを知る方法でもあります。

302 と 301 はブラウザにとっては非常に似ていますが、検索エンジンのクローラーにとってはいくつかの違いがあります。たとえば、Web サイトがメンテナンス中の場合は、302 を使用してクライアント ブラウザーを別のアドレスにリダイレクトします。検索エンジンのクローラーは、将来的にページを再インデックスするようになります。しかし、301 リダイレクトを使用する場合、ウェブサイトが新しいアドレスに恒久的に移動されたことを検索エンジンのクローラーに伝えることになります。

500 内部サーバーエラー

このコードは通常、ページ スクリプトがクラッシュしたときに表示されます。ほとんどの CGI スクリプトは、PHP のようにブラウザにエラー メッセージを出力しません。致命的なエラーが発生した場合は、ステータス コード 500 が送信されます。この時点で、トラブルシューティングを行うには、サーバーのエラー ログを確認する必要があります。

完全なリスト

HTTP ステータス コードの詳細な説明については、こちらをご覧ください。または、こちら (http://tools.jb51.net/table/http_status_code) で確認することもできます。

HTTP ヘッダー内の HTTP リクエスト

ここで、HTTP ヘッダー内の一般的な HTTP リクエスト情報を見てみましょう。

これらのヘッダーはすべて、PHP の $_SERVER 配列にあります。 getallheaders()関数を使用して、すべてのヘッダー情報を一度に取得することもできます。

ホスト

HTTP リクエストは特定の IP アドレスに送信されますが、ほとんどのサーバーは同じ IP アドレスで複数の Web サイトをホストする機能を備えているため、サーバーはブラウザーが要求しているドメイン名を認識する必要があります。

Host: rlog.cn

これは、ドメインとサブドメインを含む単なる基本ホスト名です。

PHP では、$_SERVER['HTTP_HOST'] または $_SERVER['SERVER_NAME'] を介してこれを表示できます。

ユーザーエージェント

User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)

このヘッダーには次の情報を含めることができます。

  • ブラウザ名とバージョン番号。
  • オペレーティング システムの名前とバージョン番号。
  • デフォルトの言語。

これは、一部の Web サイトが訪問者に関する情報を収集するために使用する一般的な方法です。たとえば、訪問者がモバイル フォンからサイトにアクセスしているかどうかを判断し、低解像度でも適切に動作するモバイル サイトに誘導するかどうかを決定できます。

PHPでは、$_SERVER['HTTP_USER_AGENT']を通じてUser-Agentを取得できます。

if ( strstr($_SERVER['HTTP_USER_AGENT'],'MSIE 6') ) {
echo "Please stop using IE6!";
}

受け入れ言語

Accept-Language: en-us,en;q=0.5

この情報は、ユーザーのデフォルトの言語設定を示すことができます。ウェブサイトに異なる言語バージョンがある場合、この情報を使用してユーザーのブラウザをリダイレクトできます。

カンマで区切ることで複数の言語を運ぶことができます。最初の言語は優先言語となり、他の言語にはユーザーの言語の好みを示す「q」値(0〜1)が付けられます。

PHPでは、$_SERVER["HTTP_ACCEPT_LANGUAGE"]を使用してこの情報を取得します。

if (substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2) == 'fr') {
header('Location: http://french.mydomain.com');
}

受け入れエンコード

Accept-Encoding: gzip,deflate

最近のブラウザのほとんどは gzip 圧縮をサポートしており、この情報をサーバーに報告します。このとき、サーバーは圧縮された HTML をブラウザに送信します。これにより、ファイル サイズが約 80% 削減され、ダウンロード時間と帯域幅が節約されます。

PHPでは、$_SERVER["HTTP_ACCEPT_ENCODING"]を使用してこの情報を取得できます。 ob_gzhandler()メソッドが呼び出されると値が自動的に検出されるため、手動で確認する必要はありません。

// enables output buffering
// and all output is compressed if the browser supports it
ob_start('ob_gzhandler');

変更後

ページがすでにブラウザにキャッシュされている場合、次回そのページにアクセスしたときにブラウザはドキュメントが変更されたかどうかを検出し、次のようなヘッダーを送信します。

If-Modified-Since: Sat, 28 Nov 2009 06:38:19 GMT

この時点以降に変更されていない場合、サーバーは「304 Not Modified」を返し、コンテンツを返しません。ブラウザはキャッシュからコンテンツを自動的に読み取ります

PHP では、$_SERVER['HTTP_IF_MODIFIED_SINCE'] を使用してこれを検出できます。

// assume $last_modify_time was the last the output was updated
// did the browser send If-Modified-Since header?
if(isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])) {
// if the browser cache matches the modify time
if ($last_modify_time == strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE'])) {
// send a 304 header, and no content
header("HTTP/1.1 304 Not Modified");
exit;
}
}

また、キャッシュされた情報が正しいかどうかを判断するために使用される Etag と呼ばれる HTTP ヘッダーもあります。これについては後で説明します。

クッキー

名前が示すように、ブラウザに保存されている Cookie 情報をサーバーに送信します。

Cookie: PHPSESSID=r2t5uvjq435r4q7ib3vtdjq120; foo=bar

セミコロンで区切られた名前と値のペアのセットです。クッキーにはセッション ID も含まれる場合があります。

PHP では、個々の Cookie に $_COOKIE 配列からアクセスできます。 $_SESSION 配列を直接使用してセッション変数を取得できます。セッション ID が必要な場合は、Cookie の代わりに session_id() 関数を使用できます。

echo $_COOKIE['foo'];
// output: bar
echo $_COOKIE['PHPSESSID'];
// output: r2t5uvjq435r4q7ib3vtdjq120
session_start();
echo session_id();
// output: r2t5uvjq435r4q7ib3vtdjq120

リファラー

名前が示すように、ヘッダーには参照 URL 情報が含まれます。

たとえば、Nettuts+ のホームページにアクセスしてリンクをクリックすると、次のヘッダーがブラウザに送信されます。
Referer: http://net.tutsplus.com/

PHPでは、この値は$_SERVER['HTTP_REFERER']を通じて取得できます。

if (isset($_SERVER['HTTP_REFERER'])) {
$url_info = parse_url($_SERVER['HTTP_REFERER']);
// is the surfer coming from Google?
if ($url_info['host'] == 'www.google.com') {
parse_str($url_info['query'], $vars);
echo "You searched on Google for this keyword: ". $vars['q'];
}
}
// if the referring url was:
// http://www.google.com/search?source=ig&hl=en&rlz=&=&q=http+headers&aq=f&oq=&aqi=g-p1g9
// the output will be:
// You searched on Google for this keyword: http headers

「referrer」という単語が「referer」と誤って綴られていることにお気づきかもしれません。残念ながら、公式の HTTP 仕様ではそのように記述され、そのままになってしまいました。

承認

ページで認証が必要な場合、ブラウザにログイン ウィンドウが表示されます。正しいアカウントを入力すると、ブラウザは HTTP リクエストを送信しますが、今回は次のようなヘッダーが含まれます。

Authorization: Basic bXl1c2VyOm15cGFzcw==

ヘッダーに含まれる情報は base64 でエンコードされています。たとえば、base64_decode('bXl1c2VyOm15cGFzcw==') は 'myuser:mypass' に変換されます。

PHPでは、この値は$_SERVER['PHP_AUTH_USER']と$_SERVER['PHP_AUTH_PW']を使用して取得できます。

詳細については、WWW 認証セクションで説明します。

HTTP ヘッダー内の HTTP レスポンス

ここで、HTTP ヘッダー内の一般的な HTTP 応答情報について理解しましょう。

PHP では、 header()を通じてヘッダー応答情報を設定できます。 PHP は、コンテンツの読み込み、Cookie の設定など、いくつかの必要なヘッダー情報を自動的に送信しました。送信されたヘッダー情報と送信されるヘッダー情報は、 headers_list()関数を通じて確認できます。 headers_sent()関数を使用して、ヘッダーが送信されたかどうかを確認することもできます。

キャッシュ制御

w3.org では、これを次のように定義しています。「Cache-Control 汎用ヘッダー フィールドは、要求/応答チェーンに沿ったすべてのキャッシュ メカニズムが従わなければならないディレクティブを指定するために使用されます。」 「キャッシュ メカニズム」には、ISP が使用する可能性のあるゲートウェイとプロキシの情報が含まれます。

例えば:

Cache-Control: max-age=3600, public

「public」は、応答を誰でもキャッシュできることを意味し、「max-age」はキャッシュが有効な秒数を示します。ウェブサイトのキャッシュを許可すると、ダウンロード時間と帯域幅が大幅に削減され、ブラウザの読み込み速度も向上します。

「no-cache」ディレクティブを設定してキャッシュを無効にすることもできます。

Cache-Control: no-cache

詳細についてはw3.org を参照してください。

コンテンツタイプ

このヘッダーには、ドキュメントの「MIME タイプ」が含まれます。ブラウザはこのパラメータに基づいてドキュメントを解析する方法を決定します。たとえば、HTML ページ (または HTML 出力の PHP ページ) は次のような結果を返します。

Content-Type: text/html; charset=UTF-8

「text」はドキュメントタイプ、「html」はドキュメントのサブタイプです。 このヘッダーには、文字セットなどの詳細情報も含まれます。

画像の場合、応答は次のようになります。

Content-Type: image/gif

ブラウザは、MIME タイプを使用して、ドキュメントを開くために外部プログラムを使用するか、独自の拡張機能を使用するかを決定できます。次の例では、Adobe Reader を呼び出します。

Content-Type: application/pdf

直接ロードする場合、Apache は通常、ドキュメントの MIME タイプを自動的に判別し、適切な情報をヘッダーに追加します。また、ほとんどのブラウザにはある程度のフォールト トレランス機能があります。ヘッダーがこの情報を提供しない、または誤って提供する場合、ブラウザは自動的に MIME タイプを検出します。

一般的な MIME タイプのリストは、こちらでご覧いただけます。

PHP では、finfo_file()を使用してファイルの ime タイプを検出できます。

コンテンツ配置

このヘッダーは、応答の内容を解析するのではなく、ファイルのダウンロード ウィンドウを開くようにブラウザに指示します。例えば:

Content-Disposition: attachment; filename="download.zip"

ブラウザに次のようなダイアログ ボックスが表示されます。

適切な Content-Type ヘッダーも送信されることに注意してください。

Content-Type: application/zip
Content-Disposition: attachment; filename="download.zip"

コンテンツの長さ

コンテンツがブラウザに送信されるときに、サーバーはこのヘッダーを使用して、送信されるファイルのサイズ (バイト) をブラウザに通知できます。

Content-Length: 89123

この情報はファイルのダウンロードに非常に役立ちます。このようにしてブラウザはダウンロードの進行状況を認識します。

たとえば、ここではダウンロード速度が遅い場合をシミュレートするダミー スクリプトを作成しました。

// it's a zip file
header('Content-Type: application/zip');
// 1 million bytes (about 1megabyte)
header('Content-Length: 1000000');
// load a download dialogue, and save it as download.zip
header('Content-Disposition: attachment; filename="download.zip"');
// 1000 times 1000 bytes of data
for ($i = 0; $i < 1000; $i++) {
echo str_repeat(".",1000);
// sleep to slow down the download
usleep(50000);
}

結果は次のようになります。

ここで、Content-Length ヘッダーをコメント アウトします。

// it's a zip file
header('Content-Type: application/zip');
// the browser won't know the size
// header('Content-Length: 1000000');
// load a download dialogue, and save it as download.zip
header('Content-Disposition: attachment; filename="download.zip"');
// 1000 times 1000 bytes of data
for ($i = 0; $i < 1000; $i++) {
echo str_repeat(".",1000);
// sleep to slow down the download
usleep(50000);
}

結果は次のようになります:

ブラウザではダウンロードした量のみが表示されますが、合計でダウンロードする必要がある量は表示されません。また、進行状況バーにも進行状況が表示されません。

エタグ

これはキャッシュ目的で生成される別のヘッダーです。次のようになります:

Etag: "pub1259380237;gz"

サーバーは、送信された各ファイルとともにこの情報をブラウザに応答する場合があります。この値には、ドキュメントの最終更新日、ファイル サイズ、またはファイル チェックサムが含まれます。ブラウザは受信したドキュメントとともにそれをキャッシュします。次回ブラウザが同じファイルを要求すると、次の HTTP 要求が送信されます。

If-None-Match: "pub1259380237;gz"

要求されたドキュメントの Etag 値が一致する場合、サーバーは 2oo ではなく 304 ステータス コードを送信します。そして、コンテンツは返されません。ブラウザはキャッシュからファイルを読み込みます。

最終更新日

名前が示すように、このヘッダーはドキュメントの最終変更時刻を GMT 形式で示します。

Last-Modified: Sat, 28 Nov 2009 03:50:37 GMT

$modify_time = filemtime($file);
header("Last-Modified: " . gmdate("D, d MYH:i:s", $modify_time) . " GMT");

別のキャッシュ メカニズムを提供します。ブラウザは次のようなリクエストを送信する場合があります。

If-Modified-Since: Sat, 28 Nov 2009 06:38:19 GMT

これについては、If-Modified-Since セクションですでに説明しました。

位置

このヘッダーはリダイレクトに使用されます。応答コードが 301 または 302 の場合、サーバーはこのヘッダーを送信する必要があります。たとえば、http://www.nettuts.com にアクセスすると、ブラウザは次の応答を受け取ります。

HTTP/1.x 301 Moved Permanently
...
Location: http://net.tutsplus.com/
...

PHP では、次のように訪問者をリダイレクトできます。
header('Location: http://net.tutsplus.com/');

デフォルトでは、302 ステータス コードが送信されます。301 を送信する場合は、次のように記述します。

header('Location: http://net.tutsplus.com/', true, 301);

Cookie の設定

ウェブサイトが閲覧履歴の Cookie を設定または更新する必要がある場合、次のようなヘッダーが使用されます。

Set-Cookie: skin=noskin; path=/; domain=.amazon.com; expires=Sun, 29-Nov-2009 21:42:28 GMT
Set-Cookie: session-id=120-7333518-8165026; path=/; domain=.amazon.com; expires=Sat Feb 27 08:00:00 2010 GMT

各 Cookie は個別のヘッダーとして送信されます。 js 経由で Cookie を設定しても、HTTP ヘッダーには反映されないことに注意してください。

PHP では、 setcookie()関数を使用して Cookie を設定することができ、PHP は適切な HTTP ヘッダーを送信します。

setcookie("TestCookie", "foobar");

次のヘッダーが送信されます。

Set-Cookie: TestCookie=foobar

有効期限が指定されていない場合、ブラウザを閉じると Cookie は削除されます。

WWW認証

ウェブサイトはユーザーを認証するためにこのヘッダーを HTTP 経由で送信する場合があります。ブラウザはヘッダーでこの応答を確認するとポップアップを開きます。

WWW-Authenticate: Basic realm="Restricted Area"

次のようになります:

PHP マニュアルの章に、PHP でこれを行う方法を示す簡単なコードがあります。

if (!isset($_SERVER['PHP_AUTH_USER'])) {
header('WWW-Authenticate: Basic realm="My Realm"');
header('HTTP/1.0 401 Unauthorized');
echo 'Text to send if user hits Cancel button';
exit;
} else {
echo "<p>Hello {$_SERVER['PHP_AUTH_USER']}.</p>";
echo "<p>You entered {$_SERVER['PHP_AUTH_PW']} as your password.</p>";
}

コンテンツエンコーディング

このヘッダーは通常、返されるコンテンツが圧縮されている場合に設定されます。

Content-Encoding: gzip

PHP では、 ob_gzhandler()関数を呼び出すと、このヘッダーが自動的に設定されます。

元の URL: http://css9.net/all-about-http-headers/

<<:  テーブルを Excel にエクスポートする純粋な JS メソッド

>>:  MySQL 8の新機能ROLEの詳しい説明

推薦する

MySQL の遅いクエリ操作の例の分析 [有効化、テスト、確認など]

この記事では、MySQL のスロー クエリ操作について例を挙げて説明します。ご参考までに、詳細は以下...

resizeを使用して画像切り替えプレビュー機能を実装する方法

要点CSS resize プロパティを使用すると、要素のサイズ変更可能性を制御できます。サイズ変更を...

DockerはRedisをインストールし、操作用のビジュアルクライアントを導入します

1 はじめにRedis 、 ANSI C言語で開発されたKey-Valueベースの高性能NoSQLデ...

MySQL 5.x 以降を使用している場合のエラー #1929 列 ''createtime'' の日付時刻値が正しくありません: '''' の簡単な解決方法

MySQL をインストールした後、テーブル データを保存および削除しようとすると、常にエラー メッセ...

Docker がポート 2375 を公開し、サーバー攻撃を引き起こす問題と解決策

docker リモート API を学習した学生であれば、ポート 2375 についてよくご存知だと思い...

JavaScript 関数構文の説明

目次1. 通常の機能2. 矢印関数3. データパケットJSON 4. オブジェクト5. 約束6. 非...

CSS変数を使用してダークモードを実装するためのサンプルコード

最近、WeChatはAppleによってダークモードの開発を強制されました。ますます多くのウェブサイト...

sql_mode を変更する際の MySQL エラーの解決方法

目次ERR 1067による殺人事件2番目の問題の原因はsql_modeです3. sql_modeを設...

MySQLの空の値とnull値の違いを知っていますか?

序文最近、友人がSQLを書くときにnull値を判定する方法が間違っていて、プログラム内のデータにエラ...

Windows Server 2008 64ビット MySQL5.6 インストール不要版 設定方法図

1 公式ウェブサイトから MySQL 5.6 バージョンの圧縮パッケージmysql-5.6.36-w...

TeamCenter12 にログインする際の 404/503 問題の解決方法

TeamCenter12はアカウントのパスワードを入力し、ログインをクリックすると、404または50...

Dockerは1行のコマンドでFTPサービス構築の実装を完了します

1行のコマンド docker run -d \ -v /share:/home/vsftpd \ -...

MySQLのマスタースレーブ構成を使用して、読み取りと書き込みの分離を実現し、データベースの負荷を軽減します。

大規模な Web サイトでは、多数の同時アクセスを処理するために、Web サイト上の分散負荷分散以上...

Vue2.0+ElementUI+PageHelperで実装されたテーブルページング機能

序文最近、いくつかのフロントエンド プロジェクトに取り組んでおり、ページにいくつかのテーブルを表示す...

H5ゲームをnginxサーバーにデプロイする方法の詳細な説明

自己学習型ゲーム開発の道において、最も充実した瞬間は、自分でミニゲームを作り、友達と共有して試しにプ...