ホームページ > php教程 > php手册 > Web 開発ヘルプ: http ヘッダーについて詳しく学ぶ

Web 開発ヘルプ: http ヘッダーについて詳しく学ぶ

WBOY
リリース: 2016-06-21 08:56:33
オリジナル
1477 人が閲覧しました

フロントエンドであれバックエンドであれ、HTTP ヘッダーを理解することは間違いなく Web 開発に大いに役立ちます。この記事では、http ヘッダーのあらゆる側面を学びましょう。

HTTP ヘッダーとは

HTTP は「ハイパーテキスト転送プロトコル」によって記述されています。このプロトコルは、この記事など、ブラウザーで表示されるほとんどのコンテンツが http プロトコルを介して送信されます。

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

ブラウザのアドレス バーに URL を入力すると、ブラウザは次のような http リクエストを作成します:

GET /tutorials/other / top-20-mysql-best-practices/ HTTP/1.1<code>GET /tutorials/other/top-20-mysql-best-practices/ HTTP/1.1<br>Host: net.tutsplus.com<br>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)<br>Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8<br>Accept-Language: en-us,en;q=0.5<br>Accept-Encoding: gzip,deflate<br>Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7<br>Keep-Alive: 300<br>Connection: keep-alive<br>Cookie: PHPSESSID=r2t5uvjq435r4q7ib3vtdjq120<br>Pragma: no-cache<br>Cache-Control: no-cache<br>ホスト: net.tutsplus.com
ユーザーエージェント: 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)
受け入れる: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

受け入れ言語: en-us,en;q=0.5

受け入れエンコーディング: gzip,deflate受け入れ文字セット: ISO-8859-1,utf-8;q=0.7,*;q= 0.7 キープアライブ: 300

接続: キープアライブ

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

キャッシュ制御: キャッシュなし

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

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

HTTP/1.x 200 OK

転送エンコーディング: チャンク

日付: Sat, 28 Nov 2009 04:36:25 GMT

サーバー: LiteSpeed

接続: close

X-Powered-By: W3 Total Cache/0.8

プラグマ: public

有効期限: Sat, 28 Nov 2009 05:36:25 GMT

Etag: "pub1259380237;gz"

キャッシュ制御: max-age=3600、public

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

最終更新日: Sat, 28 Nov 2009 03:50:37 GMT

X -ピンバック: http://net.tutsplus.com/xmlrpc.php
    Content-Encoding: gzip
  • Vary: Accept-Encoding、Cookie、User-Agent
最初の行は「ステータス行」と呼ばれ、その後に http ヘッダーが続き、空白行の後にコンテンツの出力が開始されます (この場合は HTML 出力)。

しかし、ページのソース コードを表示すると、表示されるものと一緒に HTTP ヘッダーがブラウザに送信されますが、HTTP ヘッダーは表示されません。

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

詳細を見てみましょう。

HTTP ヘッダーを確認する方法
  • 次の FireFox 拡張機能は、HTTP ヘッダーの分析に役立ちます:
  • 1. ファイアバグ
2.ライブ HTTP ヘッダー

3. PHP の場合:

getallheaders() はリクエスト ヘッダーを取得するために使用されます。<font face="新宋体">GET /tutorials/other/top-20-mysql-best-practices/ HTTP/1.1<br>Host: net.tutsplus.com</font> 配列を使用することもできます。

headers_list() は、応答ヘッダーを取得するために使用されます。

記事の下に php のデモンストレーションの使用例がいくつかあります。

HTTPリクエストの構造

「最初の行」と呼ばれる最初の行には、次の 3 つの部分が含まれています。

「メソッド」は、これがどのタイプのリクエストであるかを示します。最も一般的なリクエストのタイプは、

です。

「パス」はホストの後のパスを反映します。たとえば、「http://net.tutsplus.com/tutorials/other/top-20-mysql-best-practices/」をリクエストした場合、パスは「」になります。 /tutorials/other/top-20-mysql-best-practices/"。

「プロトコル」には「HTTP」とバージョン番号が含まれており、最新のブラウザでは

が使用されます。 残りの各行は「名前:値」のペアです。これらには、リクエストとブラウザに関するさまざまな情報が含まれています。たとえば、「User-Agent」は、ブラウザのバージョンと使用しているオペレーティング システムを示します。 「Accept-Encoding」は、ブラウザーが gzip などの圧縮出力を受け入れることができることをサーバーに伝えます。 これらのヘッダーのほとんどはオプションです。 HTTP リクエストは次のように圧縮することもできます: GET /tutorials/other/top-20-mysql-best-practices/ HTTP/1.1ホスト: net.tutsplus.com そして、サーバーから有効な応答を受け取ります。 リクエストタイプ 最も一般的な 3 つのリクエスト タイプは、GET、POST、HEAD です。最初の 2 つは、HTML の作成プロセスでよく知られているかもしれません。 GET: ドキュメントを取得します ブラウザに送信される html、画像、js、css などのほとんどは、GET メソッドを通じてリクエストされます。これはデータを取得する主な方法です。 たとえば、Nettuts+ 記事を取得するには、http リクエストの最初の行は通常次のようになります:

<font face="新宋体">GET /tutorials/other/top-20-mysql-best-practices/ HTTP/1.1</font>

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

<font face="新宋体">GET /wp-content/themes/tuts_theme/images/header_bg_tall.png HTTP/1.1</font>

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

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

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

<font face="新宋体">GET /foo.php?first_name=John&last_name=Doe&action=Submit HTTP/1.1<br>...</font>

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

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

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

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

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

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

<font face="新宋体">POST /foo.php HTTP/1.1<br>Host: localhost<br>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)<br>Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8<br>Accept-Language: en-us,en;q=0.5<br>Accept-Encoding: gzip,deflate<br>Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7<br>Keep-Alive: 300<br>Connection: keep-alive<br>Referer: http://localhost/test.php<br>Content-Type: application/x-www-form-urlencoded<br>Content-Length: 43<br>first_name=John&last_name=Doe&action=Submit</font>

ここで注意すべき点が 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 が見つかりません

わかりやすい

401 不正

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

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

403 禁止

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

他の方法でもアクセス許可制限を送信することがあります。たとえば、IP アドレスでブロックすることができますが、これには htaccess の助けが必要です。

<font face="新宋体">order allow,deny<br>deny from 192.168.44.201<br>deny from 224.39.163.12<br>deny from 172.16.7.92<br>allow from all</font>

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

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

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

500 内部サーバー エラー

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

全リスト

HTTP ステータス コードの完全な説明はここで見つけることができます。

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

次に、HTTP ヘッダーに含まれる一般的な HTTP リクエスト情報をいくつか見てみましょう。

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

ホスト

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

<font face="新宋体">Host: rlog.cn</font>

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

PHP では、$_SERVER["HTTP_HOST"] または $_SERVER["SERVER_NAME"] を通じて表示できます。

ユーザーエージェント

<font face="新宋体">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)</font>

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

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

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

PHP では、$_SERVER["HTTP_USER_AGENT"] を通じてユーザー エージェントを取得できます

<font face="新宋体">if ( strstr($_SERVER["HTTP_USER_AGENT"],"MSIE 6") ) {<br>echo "Please stop using IE6!";<br>}</font>

言語を受け入れる

<font face="新宋体">Accept-Language: en-us,en;q=0.5</font>

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

カンマ区切りで複数の言語を表示できます。最初の言語が優先言語となり、他の言語にはユーザーの言語の優先順位を示す「q」値 (0 ~ 1) が付きます。

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

<font face="新宋体">if (substr($_SERVER["HTTP_ACCEPT_LANGUAGE"], 0, 2) == "fr") {<br>header("Location: http://french.mydomain.com");<br>}</font>

Accept-Encoding

<font face="新宋体">Accept-Encoding: gzip,deflate</font>

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

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

<font face="新宋体">// enables output buffering<br>// and all output is compressed if the browser supports it<br>ob_start("ob_gzhandler");</font>

変更後の場合

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

<font face="新宋体">If-Modified-Since: Sat, 28 Nov 2009 06:38:19 GMT</font>

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

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

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

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

クッキー

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

<font face="新宋体">Cookie: PHPSESSID=r2t5uvjq435r4q7ib3vtdjq120; foo=bar</font>

これは、セミコロンで区切られた名前と値のペアのセットです。 Cookie にはセッション ID を含めることもできます。

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

<font face="新宋体">echo $_COOKIE["foo"];<br>// output: bar<br>echo $_COOKIE["PHPSESSID"];<br>// output: r2t5uvjq435r4q7ib3vtdjq120<br>session_start();<br>echo session_id();<br>// output: r2t5uvjq435r4q7ib3vtdjq120</font>

参照者

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

たとえば、Nettuts+ ホームページにアクセスしてリンクをクリックすると、次のヘッダー情報がブラウザに送信されます:
<font face="新宋体">Referer: http://net.tutsplus.com/ </font>

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

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

/ / サーファーは Google から来ていますか?

if ($url_info["host"] == "www.google.com") {

parse_str($url_info["query"], $vars);

echo "次のキーワードを Google で検索しました: "。$vars["q"];

}

}

// 参照 URL が次の場合:

// http://www .google.com/search?source=ig&hl=en&rlz=&=&q=http+headers&aq=f&oq=&aqi=g-p1g9<font face="新宋体">Authorization: Basic bXl1c2VyOm15cGFzcw==</font>// 出力は次のようになります:

// Google でこのキーワードを検索しました: http ヘッダー

「referrer」という単語のスペルが「referer」と間違っていることに気づいたかもしれませんが、残念なことに、このように公式の HTTP 仕様に組み込まれてしまい、行き詰まってしまいました。

承認

ページで認証が必要な場合、ブラウザは正しいアカウント番号を入力した後、ログイン ウィンドウをポップアップ表示します。ただし、今回は次のようなヘッダーが含まれます。

ヘッダーに含まれる情報のこの部分は、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 のゲートウェイおよびプロキシ情報が使用される場合があります。

例:

<font face="新宋体">Cache-Control: max-age=3600, public</font>

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

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

<font face="新宋体">Cache-Control: no-cache </font>

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

コンテンツタイプ

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

<font face="新宋体">Content-Type: text/html; charset=UTF-8</font>

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

画像の場合、次の応答が送信されます:

<font face="新宋体">Content-Type: image/gif</font>

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

<font face="新宋体">Content-Type: application/pdf</font>

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

一般的に使用される MIME タイプのリストはここにあります。

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

コンテンツの配置

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

<font face="新宋体">Content-Disposition: attachment; filename="download.zip"</font>

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

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

<font face="新宋体">Content-Type: application/zip<br>Content-Disposition: attachment; filename="download.zip"</font>

コンテンツの長さ

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

<font face="新宋体">Content-Length: 89123</font>

この情報は、ファイルのダウンロードに非常に役立ちます。これが、ブラウザがダウンロードの進行状況を認識する理由です。

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

<font face="新宋体">// zip ファイルです<br>header("Content-Type: application/zip");<br>// 100 万バイト (約1megabyte)<br>header("Content-Length: 1000000");<br>// ダウンロード ダイアログをロードし、download.zip として保存します<br>header("Content-Disposition:attachment; filename= "download.zip"");<br>// 1000 バイトのデータを 1000 倍<br>for ($i = 0; $i <span style=" WHITE-SPACE: pre"> <code><font face="新宋体">// it"s a zip file<br>header("Content-Type: application/zip");<br>// 1 million bytes (about 1megabyte)<br>header("Content-Length: 1000000");<br>// load a download dialogue, and save it as download.zip<br>header("Content-Disposition: attachment; filename="download.zip"");<br>// 1000 times 1000 bytes of data<br>for ($i = 0; $i < 1000; $i++) {<br/><span style="WHITE-SPACE: pre"> </span>echo str_repeat(".",1000);<br/><span style="WHITE-SPACE: pre"> </span>// sleep to slow down the download<br/><span style="WHITE-SPACE: pre"> </span>usleep(50000);<br/>}</font>echo str_repeat(".",1000);

// ダウンロードを遅くするためにスリープします

usleep(50000);
}

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

次に、Content-Length ヘッダーをコメントアウトします。<font face="新宋体">// it"s a zip file<br/>header("Content-Type: application/zip");<br/>// the browser won"t know the size<br/>// header("Content-Length: 1000000");<br/>// load a download dialogue, and save it as download.zip<br/>header("Content-Disposition: attachment; filename="download.zip"");<br/>// 1000 times 1000 bytes of data<br/>for ($i = 0; $i < 1000; $i++) {<br/><span style="WHITE-SPACE: pre"> </span>echo str_repeat(".",1000);<br/><span style="WHITE-SPACE: pre"> </span>// sleep to slow down the download<br/><span style="WHITE-SPACE: pre"> </span>usleep(50000);<br/>}</font>

<font face="新宋体">// zip ファイルです<br/>header("Content-Type: application/zip");<br/>// ブラウザは動作しませんサイズを確認します<br/>// header("Content-Length: 1000000");<br/>// ダウンロード ダイアログをロードし、download.zip として保存します<br/>header("Content-Disposition:attachment ; filename="download.zip"");<br/>// 1000 バイトのデータの 1000 倍<br/>for ($i = 0; $i <1000; $i++) {<br/><span style="WHITE-SPACE: pre"> <p>echo str_repeat(".",1000);<br/><span style="WHITE-SPACE: pre"> </p>// ダウンロードを遅くするためにスリープします<br/><span style="WHITE-SPACE: pre"> <p>usleep(50000);<br/>}</font>

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

このブラウザでは、ダウンロードされた量のみが表示され、合計でどれくらいダウンロードする必要があるかは表示されません。また、プログレスバーには進行状況が表示されません。

<🎜>Eタグ<🎜> <🎜>これは、キャッシュ用に生成された別のヘッダーです。次のようになります: <🎜>

<font face="新宋体">Etag: "pub1259380237;gz"</font>

サーバーは、送信された各ファイルとともにこの情報をブラウザーに応答することがあります。値には、ドキュメントの最終変更日、ファイル サイズ、またはファイル チェックサムを含めることができます。ブラウズすると、受信したドキュメントとともにキャッシュされます。次回ブラウザが同じファイルを再度リクエストすると、次の HTTP リクエストが送信されます:

<font face="新宋体">If-None-Match: "pub1259380237;gz"</font>

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

最終更新日

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

<font face="新宋体">Last-Modified: Sat, 28 Nov 2009 03:50:37 GMT</font>

<font face="新宋体">$modify_time = filemtime($file);<br/>header("Last-Modified: " . gmdate("D, d M Y H:i:s", $modify_time) . " GMT");</font>

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

<font face="新宋体">If-Modified-Since: Sat, 28 Nov 2009 06:38:19 GMT</font>

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

場所

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

<font face="新宋体">HTTP/1.x 301 Moved Permanently<br/>...<br/>Location: http://net.tutsplus.com/<br/>...</font>

PHP では、次の方法で訪問者をリダイレクトできます:
<font face="新宋体">header("Location: http://net.tutsplus.com/");</font>

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

<font face="新宋体">header("Location: http://net.tutsplus.com/", true, 301);</font>

セットクッキー

Web サイトは、閲覧する Cookie 情報を設定または更新する必要がある場合、次のようなヘッダーを使用します:

<font face="新宋体">Set-Cookie: スキン=noskin path=/; ドメイン=.amazon.com 有効期限=2009 年 11 月 29 日(日) 21:42:28 GMT<code><font face="新宋体">Set-Cookie: skin=noskin; path=/; domain=.amazon.com; expires=Sun, 29-Nov-2009 21:42:28 GMT<br/>Set-Cookie: session-id=120-7333518-8165026; path=/; domain=.amazon.com; expires=Sat Feb 27 08:00:00 2010 GMT</font>Set-Cookie: session-id=120-7333518-8165026; path=/; 有効期限=2010 年 2 月 27 日土曜日 08:00:00 GMT

各 Cookie は個別のヘッダー情報として使用されます。 js を介して Cookie を設定しても、HTTP ヘッダーには反映されないことに注意してください。

PHP では、setcookie() 関数を通じて Cookie を設定でき、PHP は適切な HTTP ヘッダーを送信します。

<font face="新宋体">setcookie("TestCookie", "foobar");</font>

次のようなヘッダー情報が送信されます:

<font face="新宋体">Set-Cookie: TestCookie=foobar</font>

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

WWW 認証

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

<font face="新宋体">WWW-Authenticate: Basic realm="Restricted Area"</font>

次のようになります:

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

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

header("HTTP/1.0 401 Unauthorized");

echo "ユーザーがキャンセルボタンを押した場合に送信するテキスト";

exit;

} else {

echo "

こんにちは{$_SERVER["PHP_AUTH_USER"]}.

";

echo "

gt;パスワードとして {$_SERVER["PHP_AUTH_PW"]} を入力しました。

";<font face="新宋体">Content-Encoding: gzip</font>}

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

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



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

翻訳元: http://rlog.cn/?p=521
関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート