HTTPヘッダー
HTTPヘッダーは、クライアント(通常はウェブブラウザ)とサーバー上のアプリケーション間で、追加情報やメタデータを通信するために使用されるname:value
ペア(名前と値をコロンで区切る)の文字列です。追加情報の例としては、データのエンコード方法、サーバーのデータ処理方法、ドキュメントの作成日などが挙げられます。
レスポンスヘッダー(アプリケーションからクライアント)は、アプリケーションのレスポンスの一部で、サーバーの場所や名前などの情報を含みます。
リクエストヘッダー(クライアントからアプリケーション)は、以下のように、アプリケーションをカスタマイズしたい場合に有用です。
CF-IPCountry
でクライアントの地域に応じて異なるコンテンツを配信CF-Connecting-IP
でアプリのアクティビティログにクライアントIPアドレスを記録X-Request-ID
でデバッグやユーザーセッションを監視
Kinstaのリクエストヘッダー
Kinstaでアプリケーションをデプロイする際、アプリケーションに情報を送信するために、以下のヘッダーが使用されます。
Host
:要求されるサーバーのホスト名とポート番号を指定X-Request-ID
:クライアントとサーバー間のリクエストを識別(デバッグに有用)X-Real-IP
:リクエストを行ったクライアントの実際のIPアドレスを指定(通常、リバースプロキシやロードバランサーによって、 元のクライアントのIPアドレスを示すために使用)X-Forwarded-For
:クライアントのIPアドレスを指定(リクエストが複数のプロキシを通過する場合はIPアドレスの一覧も指定可能)X-Forwarded-Host
:クライアントが要求した元のホストを指定X-Forwarded-Port
:クライアントが要求に使用したポートを指定X-Forwarded-Proto
:クライアントが要求時に使用するプロトコルを指定X-Forwarded-Scheme
:クライアントが要求時に使用するスキーム(HTTPやHTTPSなど)を指定X-Scheme
:X-Forwarded-Scheme
同様、クライアントが要求した元のスキームを指定X-Original-Forwarded-For
:複数のプロキシを通過した要求の元のクライアントIPアドレスを指定Accept-Encoding
:クライアントが理解できるエンコード方式を指定(gzip
やdeflate
など)CF-Ray
:各要求に対してCloudflareが生成する一意の識別子CF-Visitor
:Cloudflareがサーバーにクライアントのブラウザとデバイスに関する情報を送信するのに使用CF-EW-Via
:Cloudflare WorkersでEdge Workerが要求を処理したことを示すCDN-Loop
:要求のループが発生し、終了が必要なことを示す(一部CDNで使用)Accept
:クライアントがレスポンスで扱うことのできるメディアの種類を指定(text/html
やapplication/json
など)User-Agent
:クライアントのブラウザとOSを識別するのに必要なクライアントのユーザーエージェント文字列を指定CF-Connecting-IP
:Cloudflareのネットワークを通じてサーバーに接続しているクライアントIPアドレスを指定CF-Worker
:Cloudflare Workersが要求を処理したことを示すCF-IPCountry
:Cloudflareが判定したクライアントIPアドレスの国コードを指定
リクエストヘッダーを確認する
レスポンスヘッダーは、HTTPステータス&リダイレクトチェッカー、またはcurl
、Postman、Insomniaなどで確認することができますが、リクエストヘッダーは、アプリケーションのコードを使用して確認します。以下はPythonを使用した例です。
from http.server import BaseHTTPRequestHandler, HTTPServer
import loggingclass RequestHandler(BaseHTTPRequestHandler):
def do_GET(self):
logging.info("GET request,nPath: %snHeaders:n%sn",
str(self.path), str(self.headers))
self.send_response(200)
self.send_header('Content-type', 'text/html')
self.end_headers()
message = f"{self.headers}"
self.wfile.write(bytes(message, 'utf-8'))
returndef run(server_class=HTTPServer, handler_class=RequestHandler, port=8080):
logging.basicConfig(level=logging.INFO)
server_address = ('', port)
httpd = server_class(server_address, handler_class)
logging.info('Starting httpd...n')
try:
httpd.serve_forever()
except KeyboardInterrupt:
pass
httpd.server_close()
logging.info('Stopping httpd...n')if __name__ == '__main__':
from sys import argvif len(argv) == 2:
run(port=int(argv[1]))
else:
run()