PHP8ヘッダーでCORS対策
PHP8でHTTPヘッダーを扱う基本
PHP8では、HTTPヘッダーを送信する際にheader関数が引き続き中心的な役割を果たします。header関数は、レスポンスヘッダーを追加・変更するためのシンプルなインターフェースを提供し、HTTPヘッダーの構築を容易にします。例えば、header('Content-Type: text/html; charset=UTF-8'); のように記述するだけで、クライアントに対して正しいMIMEタイプと文字コードを伝えることができます。
PHP8の新機能として、header_remove() や headers_sent() の戻り値がより厳密になり、ヘッダー送信のタイミングを正確に把握できるようになりました。これにより、ヘッダー送信後に出力が混在するケースを防ぎ、HTTPヘッダーの整合性を保つことができます。
header関数とhttp_response_codeの使い分け
header関数は任意のヘッダーを送信できる汎用的な関数ですが、ステータスコードを設定する場合は http_response_code() を使うのが推奨されます。http_response_code(404); のように呼び出すと、サーバーは自動的に HTTP/1.1 404 Not Found を送信します。
一方、header('HTTP/1.1 404 Not Found'); のように文字列で直接送ることも可能ですが、PHP8では http_response_code() を使うことでコードの可読性と保守性が向上します。さらに、http_response_code() は既に送信されたヘッダーを確認し、重複送信を防ぐ機能も備えています。
リダイレクトとLocationヘッダー
リダイレクトを実装する際は、header('Location: https://example.com/'); を使用します。Locationヘッダーは、クライアントに対して別のURLへ移動するよう指示します。リダイレクトの種類には、301(恒久的)と302(一時的)があります。http_response_code(301); を先に呼び出し、次にLocationヘッダーを送ることで、検索エンジンやブラウザに正しいリダイレクトタイプを伝えることができます。
注意点として、Locationヘッダーを送信する前に出力が行われていないことを確認してください。出力があるとヘッダー送信が失敗し、リダイレクトが機能しません。PHP8では headers_sent() を使って確認できます。
JSONレスポンスとステータスコード
APIを構築する際は、JSONレスポンスを返すことが一般的です。header('Content-Type: application/json; charset=UTF-8'); を設定し、http_response_code(200); で成功を示します。データは json_encode() でエンコードし、echo で出力します。
http_response_code(200);
header('Content-Type: application/json; charset=UTF-8');
$data = ['status' => 'ok', 'message' => 'データ取得成功'];
echo json_encode($data, JSON_UNESCAPED_UNICODE);
エラー時は http_response_code(400) や 500 を設定し、エラーメッセージをJSONで返すことでクライアント側でのハンドリングが容易になります。
キャッシュ制御とCORS
キャッシュ制御は Cache-Control ヘッダーで行います。例えば、header('Cache-Control: no-store, no-cache, must-revalidate'); と設定すると、ブラウザやプロキシはレスポンスをキャッシュしません。逆に、静的リソースを高速化したい場合は public, max-age=86400 などを指定します。
CORS(Cross-Origin Resource Sharing)は、Access-Control-Allow-Origin ヘッダーで設定します。外部ドメインからのリクエストを許可する場合は header('Access-Control-Allow-Origin: *'); を送りますが、セキュリティを考慮して必要なドメインのみを指定することが推奨されます。さらに、Access-Control-Allow-Methods や Access-Control-Allow-Headers を設定することで、プリフライトリクエストに対応できます。
PHP8では、header() を使ったCORS設定が簡単に行えるようになり、http_response_code() と組み合わせてステータスコードを明示的に返すことで、APIの信頼性が向上します。
コメント
コメントを投稿