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

  1. barryvdh/laravel-cors パッケージを使う(Laravel 7以前)
  2. 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対応+*禁止+ヘッダー制限

今後の学習の指針

  1. HTTPレスポンスヘッダーの基礎知識を深めよう
    • Content-Type, Authorization, Cache-Control など
  2. JavaScript側のCORSエラーの読み方と対処法を覚えよう
    • DevToolsでネットワークタブを見る練習
  3. PHPフレームワークでのCORS設定にも挑戦しよう
    • Laravel, Slim, Symfonyなど
  4. セキュリティを意識したAPI設計にも目を向けよう
    • トークン認証・HTTPS・Rate Limiting など

「API連携を安全にする」ための技術は、これからのWeb開発に欠かせません。
次は「PHPでREST APIを作るには?」や「JavaScriptでfetch通信をする方法」など、さらに踏み込んで学んでみませんか?リクエスト待ってます!

セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク

投稿者プロフィール

山崎講師
山崎講師代表取締役
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。