PHPで作ったAPIを外部のドメインからアクセス可能にするには?
PHPで外部ドメインからAPIにアクセス可能にする方法:CORS対応を完全解説
こんにちは。ゆうせいです。
今回は、「PHPで作ったAPIを外部のドメインからアクセス可能にするには?」という疑問にお答えしていきます!
この設定が正しくできていないと、JavaScriptのfetch()
やaxios
でリクエストを送ったときに…
Access to fetch at 'https://api.example.com/...' from origin 'https://your-site.com' has been blocked by CORS policy.
といったエラーが発生してしまいます!
そもそもCORSとは?
CORS(Cross-Origin Resource Sharing)とは、異なるドメイン間での通信を許可するための仕組みです。
- 「A.comからB.comのAPIにアクセスしたい!」→ ブラウザがブロック
- でもB.comが「いいよ!」と明示すればアクセス可能
- その「いいよ!」の合図がHTTPレスポンスヘッダー
🔧 PHPでCORSを許可する基本的な方法
PHPでは、header()
関数を使ってHTTPレスポンスヘッダーを手動で送信します。
例①:すべてのドメインからのアクセスを許可
<?php
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Methods: GET, POST, OPTIONS");
header("Access-Control-Allow-Headers: Content-Type");
// 実際のレスポンス
echo json_encode(["message" => "CORS OK!"]);
ポイント
Access-Control-Allow-Origin: *
→ どこからでもアクセス可能(開発用)
例②:特定のドメインだけを許可する(推奨)
<?php
$allowedOrigin = "https://your-frontend.com";
if ($_SERVER['HTTP_ORIGIN'] === $allowedOrigin) {
header("Access-Control-Allow-Origin: $allowedOrigin");
header("Access-Control-Allow-Methods: GET, POST, OPTIONS");
header("Access-Control-Allow-Headers: Content-Type");
}
// APIの本体処理
echo json_encode(["status" => "success"]);
こうすれば、許可したドメインだけアクセスできるようになります!
🔄 プリフライトリクエストへの対応(OPTIONSメソッド)
JavaScriptのfetch()
でPOST
やカスタムヘッダーを送る場合、事前にOPTIONSリクエストが送信されることがあります。
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Methods: POST, GET, OPTIONS");
header("Access-Control-Allow-Headers: Content-Type, Authorization");
exit;
}
なぜexitするの?
- OPTIONSメソッドは実際の処理をする必要がない
- 必要なヘッダーだけ返して「OKだよ」と伝える
📊 フローチャート:外部からのAPIアクセスの流れ
[フロントエンド JS]
│
├─ fetch("https://api.example.com/data")
│
[API (PHP)]
│
├─ header("Access-Control-Allow-Origin: ...")
│
└─ JSONでレスポンス返す
- ヘッダーがなければ → エラー
- ヘッダーが適切なら → 正常にアクセス可能
⚠ 注意点と落とし穴
問題 | 説明 |
---|---|
header() より前に出力がある | エラーになります(ヘッダーは最初に送る必要がある) |
* と認証を同時に使えない | 認証付きリクエストには Access-Control-Allow-Origin にドメインを明示する必要あり |
キャッシュが影響することがある | 古いCORS設定がブラウザに残ることも(開発中はキャッシュクリア推奨) |
Laravelなどフレームワークの場合
Laravel
barryvdh/laravel-cors
パッケージを使う(Laravel 7以前)config/cors.php
を編集する(Laravel 8以降)
'paths' => ['api/*'],
'allowed_origins' => ['https://your-frontend.com'],
これで自動的にCORSヘッダーをつけてくれるので便利です。
✅ まとめ:PHPでもCORS制御は可能!
やりたいこと | 方法 |
---|---|
どこからでもアクセス許可 | Access-Control-Allow-Origin: * |
特定ドメインだけ許可 | Access-Control-Allow-Origin: https://〜 |
プリフライトリクエスト(OPTIONS)対応 | $_SERVER['REQUEST_METHOD'] === 'OPTIONS' で分岐 |
安全にCORS制御したい(認証付きなど) | credentials 対応+* 禁止+ヘッダー制限 |
今後の学習の指針
- HTTPレスポンスヘッダーの基礎知識を深めよう
Content-Type
,Authorization
,Cache-Control
など
- JavaScript側のCORSエラーの読み方と対処法を覚えよう
- DevToolsでネットワークタブを見る練習
- PHPフレームワークでのCORS設定にも挑戦しよう
- Laravel, Slim, Symfonyなど
- セキュリティを意識したAPI設計にも目を向けよう
- トークン認証・HTTPS・Rate Limiting など
「API連携を安全にする」ための技術は、これからのWeb開発に欠かせません。
次は「PHPでREST APIを作るには?」や「JavaScriptでfetch通信をする方法」など、さらに踏み込んで学んでみませんか?リクエスト待ってます!
セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク
投稿者プロフィール
- 代表取締役
-
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。
最新の投稿
山崎講師2025年8月16日PHPで作ったAPIを外部のドメインからアクセス可能にするには?
山崎講師2025年8月16日Java経験者のためのJavaScirpt入門
山崎講師2025年8月12日Java経験者のためのPHP入門
山崎講師2025年8月12日Java経験者がPHPでハマる10選の1 「型のゆるさ(動的型付け)に戸惑う」