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-SchemeX-Forwarded-Scheme同様、クライアントが要求した元のスキームを指定
  • X-Original-Forwarded-For:複数のプロキシを通過した要求の元のクライアントIPアドレスを指定
  • Accept-Encoding:クライアントが理解できるエンコード方式を指定(gzipdeflateなど)
  • CF-Ray:各要求に対してCloudflareが生成する一意の識別子
  • CF-Visitor:Cloudflareがサーバーにクライアントのブラウザとデバイスに関する情報を送信するのに使用
  • CF-EW-Via:Cloudflare WorkersでEdge Workerが要求を処理したことを示す
  • CDN-Loop:要求のループが発生し、終了が必要なことを示す(一部CDNで使用)
  • Accept:クライアントがレスポンスで扱うことのできるメディアの種類を指定(text/htmlapplication/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()

関連ドキュメント