HTTPは、HyperText転送プロトコルによって記述されています。全世界ワイドウェブでは、このプロトコルを使用しています。ブラウザに表示されるコンテンツのほとんどは、この記事などのHTTPプロトコルを介して送信されます。
HTTPヘッダーはHTTPリクエストと対応するコアであり、クライアントブラウザー、リクエストページ、サーバーなどに関する情報を伝達します。
ブラウザアドレスバーにURLを入力すると、ブラウザは次のHTTPリクエストに似ています。
GET /tutorials/other/top-20-mysql-best-practices/ HTTP/1.1
ホスト: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)
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
接続:キープアライブ
Cookie:phpsessid = R2T5UVJQ435R4Q7IB3VTDJQ120
プラグマ:キャッシュなし
キャッシュコントロール:キャッシュなし
最初の行は要求行と呼ばれます。このリクエストの基本情報について説明し、残りはHTTPヘッダーです。
リクエストが完了した後、ブラウザは次のHTTP応答を受信する場合があります。
HTTP/1.x 200 OK
転送エンコード:チャンク
日付:土、2009年11月28日04:36:25 GMT
サーバー:Litespeed
接続:閉じます
X-Powered-by:W3合計キャッシュ/0.8
プラグマ:パブリック
期限切れ:土、2009年11月28日05:36:25 GMT
ETAG:pub1259380237; gz
キャッシュコントロール:Max-Age = 3600、public
コンテンツタイプ:text/html; charset = utf-8
LASTMODIFIED:SAT、2009年11月28日03:50:37 GMT
x-pingback:http://net.tutsplus.com/xmlrpc.php
コンテンツエンコード:GZIP
変化:Accept-Encoding、Cookie、User-Agent
<! - ... htmlの残り... - >
最初の行はステータスラインと呼ばれ、その後にHTTPヘッダーが続きます。空白が終了すると、コンテンツが出力されます(この場合、HTML出力の一部)。
ただし、ページのソースコードを見るとHTTPヘッダーが表示されませんが、表示できるものと一緒にブラウザに送信されます。
このHTTP要求は、画像、CSSファイル、JSファイルなど、他のリソースを受信するためのいくつかのリクエストも送信します。
以下の詳細を見てみましょう。
次のFirefox拡張機能は、HTTPヘッダーを分析するのに役立ちます。
1。火剤
2.Live HTTPヘッダー
3。PHP:
記事の下には、PHPデモンストレーションを使用する例がいくつか表示されます。
最初の行と呼ばれる最初の行には、3つの部分が含まれています。
残りのセクションは、それぞれの名前の名前です:値ペア。リクエストとブラウザに関するさまざまな情報が含まれています。たとえば、ユーザーエージェントは、ブラウザバージョンと使用しているオペレーティングシステムを示します。 Accept-Encodingは、ブラウジングがGZIPと同様に圧縮出力を受け入れることができることをサーバーに伝えます。
これらのヘッダーのほとんどはオプションです。 httpリクエストはこれまで減らすこともできます。
GET /tutorials/other/top-20-mysql-best-practices/ HTTP/1.1
ホスト:net.tutsplus.com
また、サーバーから有効な応答を受信できます。
最も一般的な3つのリクエストタイプは、Get、Post、Headです。 HTMLの執筆プロセス中に、最初の2つにすでに精通している可能性があります。
HTML、画像、JS、CSS、...ブラウザに送信されるほとんどのほとんどは、GETメソッドを通じて要求されます。これがデータを取得する主な方法です。
たとえば、Nettus+の記事を取得するには、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 type = text />
姓:<入力名= last_name type = text />
<入力名=アクションタイプ= submit value = submit />
</form>
このフォームが送信されると、HTTPリクエストは次のようになります。
GET /foo.php?first_name=John&last_name=Doe&action=Submit HTTP/1.1
...
クエリ文字列に追加することにより、サーバーにフォーム入力を送信できます。
GETメソッドを介してデータをURLに添付してサーバーに渡すことはできますが、多くの場合、POSTを使用してサーバーにデータを送信する方が適切です。 GETを通じて大量のデータを送信することは非現実的であり、特定の制限があります。
フォームデータを送信するためにPOSTリクエストを使用することが一般的です。上記の例を変更してpostを使用しましょう。
<form action=foo.php method=POST>
名:<入力名= first_name type = text />
姓:<入力名= last_name type = text />
<入力名=アクションタイプ= submit value = submit />
</form>
このフォームを送信すると、次のようにHTTPリクエストが作成されます。
POST /foo.php HTTP/1.1
ホスト:LocalHost
ユーザーエージェント: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
接続:キープアライブ
参照者:http://localhost/test.php
コンテンツタイプ:Application/X-WWW-Form-Urlencoded
コンテンツレングス:43
first_name = john&last_name = doe&action = submit
注意すべき3つのことは次のとおりです。
POSTメソッドリクエストは、AJAX、アプリケーション、CURLでも使用できます。また、すべてのファイルアップロードフォームは、POSTを使用するために必要です。
ヘッドがHTTP応答のコンテンツ部分を受け入れないことを除いて、ヘッドとゲットは非常に似ています。ヘッドリクエストを送信する場合、ドキュメント自体ではなく、HTTPヘッダーにのみ興味があることを意味します。
この方法により、ブラウザはページが変更されているかどうかを判断し、キャッシュを制御できます。要求されたドキュメントが存在するかどうかを決定することもできます。
たとえば、Webサイトに多くのリンクがある場合は、ヘッドリクエストを個別に送信して、Deadリンクがあるかどうかを判断できます。これは、Getを使用するよりもはるかに高速です。
ブラウザがHTTP要求を送信すると、サーバーはHTTP応答を介してリクエストに応答します。コンテンツを気にしない場合、リクエストは次のようになります。
最初の貴重な情報は合意です。現在、サーバーはHTTP/1.xまたはHTTP/1.1を使用します。
次に、簡単なメッセージがステータスを表します。コード200は、リクエストが正常に送信され、サーバーがヘッダー情報の後に要求されたドキュメントを返すことを意味します。
私たちは皆、404ページを見てきました。サーバーから存在しないパスを要求すると、サーバーは200ではなく404で応答します。
応答の残りの部分は、HTTP要求に似ています。これらは、ページ/ファイルが変更されたときのサーバーソフトウェアに関するものです。
同様に、これらのヘッダー情報はオプションです。
上記のように、200はリクエストが成功していることを示すために使用されます。
206部分コンテンツアプリケーションが特定の範囲内のファイルのみを要求する場合、206を返します。
これは通常、ダウンロード管理、ブレークポイントの継続、またはファイルチャンクダウンロードに使用されます。
404見つかりません理解しやすいです
401不正パスワードで保護されたページは、このステータスに戻ります。正しいパスワードを入力しない場合は、ブラウザに次の情報が表示されます。
これは単なるパスワードで保護されたページであることに注意してください。パスワードの入力を要求するポップアップボックスは次のようになります。
403禁止ページにアクセスする許可がない場合は、403ステータスに戻ります。これは通常、インデックスページなしでフォルダーを開こうとするときに発生します。サーバーの設定でディレクトリコンテンツの表示が許可されていない場合、403エラーが表示されます。
また、他の方法では、IPアドレスを介してブロックできるなど、許可制限を送信します。
order allow,deny
192.168.44.201から拒否
224.39.163.12から拒否
172.16.7.92から拒否
すべてから許可します
302(または307)は一時的に移動し、301は永久に移動しましたこれらの2つの状態は、ブラウザがリダイレクトされたときに表示されます。たとえば、bit.lyのようなURL短縮サービスを使用します。これは、彼らが誰が彼らのリンクをクリックしたかを彼らが知っている方法でもあります。
302および301はブラウザに非常に似ていますが、検索エンジンクローラーにはいくつかの違いがあります。たとえば、ウェブサイトが維持されている場合、クライアントブラウザーを302で別のアドレスにリダイレクトします。検索エンジンクローラーは将来ページに再インネックスします。ただし、301リダイレクトを使用する場合、検索エンジンクローラーに伝えることを意味します。ウェブサイトは永続的に新しいアドレスに移動されました。
500サーバーエラー(内部サーバーエラー)このコードは通常、ページスクリプトがクラッシュすると表示されます。ほとんどのCGIスクリプトは、PHPのようなブラウザにエラーメッセージを出力しません。致命的なエラーが発生した場合、それらは500のステータスコードのみを送信します。現時点では、サーバーエラーログを確認してトラブルシューティングを確認する必要があります。
完全なリスト完全なHTTPステータスコードの説明はこちらでご覧いただけます。または、ここで確認してください(http://tools.vevb.com/table/http_status_code)。
次に、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サイトで使用される一般的な方法です。たとえば、訪問者が携帯電話を使用してウェブサイトにアクセスしているかどうかを知ることができ、低解像度でうまく機能するモバイルWebサイトに向けるかどうかを決定できます。
PHPでは、$ _server ['http_user_agent']でユーザーエージェントを取得できます。
if ( strstr($_SERVER['HTTP_USER_AGENT'],'MSIE 6') ) {
ECHO 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') {
ヘッダー( '場所:http://french.mydomain.com');
}
Accept-Encoding: gzip,deflate
ほとんどの最新のブラウザはGZIP圧縮をサポートし、この情報をサーバーに報告します。この時点で、圧縮されたHTMLがブラウザに送信されます。これにより、ダウンロード時間と帯域幅を節約するために、ファイルサイズをほぼ80%削減できます。
この情報は、PHPで$ _Server [http_accept_encoding]を使用して取得できます。その場合、ob_gzhandler()メソッドが呼び出されると、値が自動的に検出されるため、手動で検出する必要はありません。
// enables output buffering
//ブラウザがサポートしている場合、すべての出力が圧縮されます
ob_start( 'ob_gzhandler');
ブラウザでページがキャッシュされている場合、次回ブラウザを閲覧すると、ドキュメントが変更されたかどうかを確認し、次のようなヘッダーが送信されます。
If-Modified-Since: Sat, 28 Nov 2009 06:38:19 GMT
今回から変更されていない場合、サーバーは変更されていない304を返し、コンテンツを返しません。ブラウザは、キャッシュ内のコンテンツを自動的に読み取ります
PHPでは、$ _server ['http_if_modified_since']を使用して検出できます。
// assume $last_modify_time was the last the output was updated
//ブラウザはif-modified-sinceヘッダーを送信しましたか?
if(isset($ _ server ['http_if_modified_since'])){
//ブラウザキャッシュが変更された時間と一致する場合
if($ last_modify_time == strtotime($ _ server ['http_if_modified_since'])){
// 304ヘッダーを送信し、コンテンツはありません
ヘッダー(HTTP/1.1 304変更されていない);
出口;
}
}
ETAGと呼ばれるHTTPヘッダーもあります。これは、キャッシュされた情報が正しいかどうかを判断するために使用され、後で説明します。
名前が示すように、ブラウザに保存されているCookie情報をサーバーに送信します。
Cookie: PHPSESSID=r2t5uvjq435r4q7ib3vtdjq120; foo=bar
これは、セミコロンで割った名前と値のペアのセットです。 CookieにはセッションIDを含めることもできます。
PHPでは、$ _Cookieアレイにアクセスすることで、単一のCookieを取得できます。 $ _Sessionアレイを使用して、セッション変数を取得できます。セッションIDが必要な場合は、Cookieの代わりにsession_id()関数を使用できます。
echo $_COOKIE['foo'];
//出力:bar
echo $ _cookie ['phpsessid'];
//出力:R2T5UVJQ435R4Q7IB3VTDJQ120
session_start();
echo session_id();
//出力:R2T5UVJQ435R4Q7IB3VTDJQ120
名前が示すように、ヘッダーには参照URL情報が含まれます。
たとえば、Nettus+のホームページにアクセスしてリンクをクリックしました。このヘッダーはブラウザに送信されます。
Referer: http://net.tutsplus.com/
PHPでは、値は$ _server ['http_referer']で取得できます。
if (isset($_SERVER['HTTP_REFERER'])) {
$ 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
//出力は次のとおりです。
//このキーワードをGoogleで検索しました:HTTPヘッダー
紹介者という言葉が参照者として間違っていることに気付いたかもしれません。残念ながら、それはそのような公式のHTTP仕様になり、立ち往生しました。
ページに承認が必要な場合、ブラウザがログインウィンドウをポップアップします。正しいアカウントを入力した後、ブラウザはHTTPリクエストを送信しますが、ヘッダーが含まれます。
Authorization: Basic bXl1c2VyOm15cGFzcw==
ヘッダーに含まれる情報のこの部分は、base64エンコードされています。たとえば、base64_decode( 'bxl1c2vyom15cgfzcw ==')は「myuser:mypass」に変換されます。
PHPでは、この値は$ _server ['php_auth_user']および$ _server ['php_auth_pw']で取得できます。
www-authenticateセクションで詳細について説明します。
一般的なHTTPヘッダーのHTTP応答情報をいくつか理解させてください。
PHPでは、Header()を介してヘッダー応答情報を設定できます。 PHPは、ロードされたコンテンツ、Cookieの設定など、必要なヘッダー情報を自動的に送信しました。送信されたものを確認し、headers_list()関数を介して送信できます。 headers_sent()関数を使用して、ヘッダー情報が送信されたかどうかを確認することもできます。
w3.orgは次のように定義されています。キャッシュコントロール一般ヘッダーフィールドは、要求/応答チェーンに沿ったすべてのキャッシュメカニズムに従う必要があるディレクティブを指定するために使用されます。キャッシュメカニズムには、ISPが使用する可能性のあるゲートウェイとプロキシ情報が含まれています。
例えば:
Cache-Control: max-age=3600, public
パブリックとは、応答が誰でもキャッシュできることを意味し、最大年齢はキャッシュが有効である秒数を示します。 Webサイトをキャッシュして、ダウンロード時間と帯域幅を大幅に削減し、ブラウザの読み込み速度も改善できます。
また、キャッシュなしコマンドを設定してキャッシュを無効にすることもできます。
Cache-Control: no-cache
詳細については、w3.orgを参照してください。
このヘッダーには、ドキュメントのMIMEタイプが含まれています。ブラウザは、このパラメーターに基づいてドキュメントを解析する方法を決定します。たとえば、HTMLページ(またはHTML出力を備えたPHPページ)は、次のようなものを返します。
Content-Type: text/html; charset=UTF-8
「テキスト」はドキュメントタイプで、「HTML」はドキュメントサブタイプです。このヘッダーには、charsetなどの詳細情報も含まれています。
それが写真の場合、このような応答が送信されます:
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: application/zip
コンテンツ拡張:添付ファイル。 filename = download.zip
コンテンツをブラウザに転送する場合、サーバーはこのヘッダーを使用して、ファイルのサイズ(バイト)をブラウザに通知することができます。
Content-Length: 89123
この情報は、ファイルのダウンロードに非常に役立ちます。これが、ブラウザがダウンロードの進捗を知っている理由です。
たとえば、ここでは、遅いダウンロードをシミュレートするための仮想スクリプトを書きました。
// it's a zip file
ヘッダー( 'Content-Type:Application/Zip');
// 100万バイト(約1メガバイト)
ヘッダー( 'Content-Length:1000000');
//ダウンロードダイアログをロードし、ダウンロードとして保存します。zip
Header( 'コンテンツ - 分散:添付ファイル; filename = download.zip');
// 1000回のデータのバイト
for($ i = 0; $ i <1000; $ i ++){
echo str_repeat(。、1000);
//スリープダウンロードを遅くします
USLoop(50000);
}
結果は次のようになります:
次に、コンテンツレングスヘッダーにコメントします。
// it's a zip file
ヘッダー( 'Content-Type:Application/Zip');
//ブラウザはサイズがわかりません
// header( 'content-length:1000000');
//ダウンロードダイアログをロードし、ダウンロードとして保存します。zip
Header( 'コンテンツ - 分散:添付ファイル; filename = download.zip');
// 1000回のデータのバイト
for($ i = 0; $ i <1000; $ i ++){
echo str_repeat(。、1000);
//スリープダウンロードを遅くします
USLoop(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
私たちはすでにそれについて議論しました。
このヘッダーはリダイレクトに使用されます。応答コードが301または302の場合、サーバーはヘッダーを送信する必要があります。たとえば、http://www.nettus.comにアクセスすると、ブラウザは次の回答を受け取ります。
HTTP/1.x 301 Moved Permanently
...
場所:http://net.tutsplus.com/
...
PHPでは、このように訪問者をリダイレクトできます。
header('Location: http://net.tutsplus.com/');
デフォルトでは、302ステータスコードが送信されます。 301を送信したい場合は、次のように書いてください。
header('Location: http://net.tutsplus.com/', true, 301);
Webサイトが閲覧するCookie情報を設定または更新する必要がある場合、そのようなヘッダーを使用します。
Set-Cookie: skin=noskin; path=/; domain=.amazon.com; expires=Sun, 29-Nov-2009 21:42:28 GMT
SetCookie:session-id = 120-7333518-8165026; path =/; domain = .amazon.com;期限切れ= 2月27日土08:00:00 2010 GMT
各クッキーは、別のヘッダーとして使用されます。 JSを介してCookieを設定すると、HTTPヘッダーには反映されないことに注意してください。
PHPでは、SetCookie()関数を介してCookieを設定でき、PHPは適切なHTTPヘッダーを送信します。
setcookie(TestCookie, foobar);
次のようなヘッダーを送信します:
Set-Cookie: TestCookie=foobar
有効期限が指定されていない場合、ブラウザが閉じた後にCookieが削除されます。
ウェブサイトは、このヘッダー情報をHTTPで送信して、ユーザーを確認する場合があります。ブラウザがこの応答をヘッドに表示すると、ポップアップウィンドウが開きます。
WWW-Authenticate: Basic realm=Restricted Area
次のようになります:
PHPマニュアルの章には、PHPでこのようなことを行う方法を示す簡単なコードがあります。
if (!isset($_SERVER['PHP_AUTH_USER'])) {
ヘッダー( 'www-authenticate:Basic Realm = my Realm');
ヘッダー( 'http/1.0 401承認');
ユーザーがヒットした場合に送信するテキストをEcho 'キャンセルボタン';
出口;
} それ以外 {
echo <p> hello {$ _server ['php_auth_user']}。</p>;
echo <p>パスワードとして{$ _server ['php_auth_pw']}を入力しました。</p>;
}
このヘッダーは通常、戻りコンテンツが圧縮されているときに設定されます。
Content-Encoding: gzip
PHPでは、ob_gzhandler()関数を呼び出す場合、このヘッダーは自動的に設定されます。
元のアドレス:http://css9.net/all-about-http-headers/