PHP で CORS が機能しない
Cross-Origin Resource Sharing (CORS) を使用すると、あるドメインから別のドメインにリクエストを行うことができます。別のドメインからリクエストが行われると、ブラウザはリクエストが許可されているかどうかを示す特定のヘッダーについてサーバーの応答をチェックします。
問題:
開発者が送信しようとしていますCORS を使用した www.siteone.com から www.sitetwo.com への POST リクエスト。ただし、サーバーに必要な CORS ヘッダーを設定しているにもかかわらず、「Access-control-Allow-Origin エラー」が発生します。
リクエスト/レスポンス ヘッダー:
Response Headers Connection Keep-Alive Content-Length 487 Content-Type text/html; charset=iso-8859-1 Date Fri, 23 Aug 2013 05:53:20 GMT Keep-Alive timeout=15, max=99 Server Apache/2.2.15 (CentOS) WWW-Authenticate Basic realm="Site two Server - Restricted Area" Request Headers Accept */* Accept-Encoding gzip, deflate Accept-Language en-US,en;q=0.5 Content-Length 43 Content-Type application/x-www-form-urlencoded; charset=UTF-8 Host www.sitetwo.com Origin http://www.siteone.com Referer http://www.siteone.com/index.html User-Agent Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:23.0) Gecko/20100101 Firefox/23.0
解決策:
問題は、サーバー上での CORS ヘッダーの設定方法にあります。元のコードでは、次のヘッダーのみを含む簡素化されたアプローチが使用されていました:
header('Access-Control-Allow-Origin: *'); header('Access-Control-Allow-Methods: POST, GET, OPTIONS');
ただし、CORS 仕様によれば、リクエストを適切に処理するには、より包括的なアプローチが必要です。開発者はコードを次のように更新しました:
if (isset($_SERVER['HTTP_ORIGIN'])) { header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}"); header('Access-Control-Allow-Credentials: true'); header('Access-Control-Max-Age: 86400'); // cache for 1 day } if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') { if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD'])) header("Access-Control-Allow-Methods: GET, POST, OPTIONS"); if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS'])) header("Access-Control-Allow-Headers: {$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']}"); exit(0); } // Your actual code goes here echo "You have CORS!";
この更新されたコードは、基本的な CORS ヘッダーを設定するだけでなく、実際のリクエストが許可されるかどうかを判断するためにブラウザーによって使用されるプリフライト OPTIONS リクエストも処理します。このより徹底したアプローチを実装することにより、開発者はアプリケーションで CORS を有効にすることに成功しました。
以上がPHP で CORS ヘッダーを設定しているのに、依然として「Access-Control-Allow-Origin」エラーが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。