フロントエンドであれバックエンドであれ、HTTP ヘッダーを理解することは間違いなく Web 開発に大いに役立ちます。この記事では、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
受け入れエンコーディング: 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 レスポンスを受信する場合があります:
転送エンコーディング: チャンク
日付: Sat, 28 Nov 2009 04:36:25 GMTサーバー: LiteSpeed
接続: closeX-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しかし、ページのソース コードを表示すると、表示されるものと一緒に HTTP ヘッダーがブラウザに送信されますが、HTTP ヘッダーは表示されません。
詳細を見てみましょう。
HTTP ヘッダーを確認する方法
3. PHP の場合:
getallheaders() はリクエスト ヘッダーを取得するために使用されます。<font face="新宋体">GET /tutorials/other/top-20-mysql-best-practices/ HTTP/1.1<br>Host: net.tutsplus.com</font>
配列を使用することもできます。
記事の下に php のデモンストレーションの使用例がいくつかあります。
「最初の行」と呼ばれる最初の行には、次の 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>
フォーム入力をクエリ文字列に追加することで、サーバーに送信できます。
データを 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 つあります:
HEAD: ヘッダー情報を受信します
このメソッドを使用すると、ブラウザーはページが変更されたかどうかを判断し、キャッシュを制御できます。また、要求されたドキュメントが存在するかどうかを判断することもできます。
たとえば、Web サイトに多数のリンクがある場合、それぞれに HEAD リクエストを送信するだけで、無効なリンクがあるかどうかを判断できます。これは、GET を使用するよりもはるかに高速です。
http 応答構造
最初の貴重な情報は契約です。現在、サーバーは HTTP/1.x または HTTP/1.1 を使用します。
次の短いメッセージはステータスを表します。コード 200 は、リクエストが正常に送信され、サーバーがヘッダー情報の後にリクエストしたドキュメントを返すことを意味します。
誰もが「404」ページを見たことがあるでしょう。存在しないパスをサーバーに要求すると、サーバーは 200 ではなく 404 で応答します。
残りの応答内容は HTTP リクエストと同様です。これらは、サーバー ソフトウェア、ページ/ファイルがいつ変更されたか、MIME タイプなどに関するものです...
繰り返しますが、これらのヘッダーはオプションです。
HTTP ステータスコード
前述したように、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 リクエスト情報をいくつか見てみましょう。
これらのヘッダー情報はすべて、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>
<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"]);
if ($url_info["host"] == "www.google.com") {
parse_str($url_info["query"], $vars);}
// 参照 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>
// 出力は次のようになります:
「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 はブラウザを閉じた後に削除されます。
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"");
} 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