質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.12%
Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CORS

CORSとはCross-Origin Resource Sharingの頭文字をとったもので、ブラウザがオリジン以外のサーバからデータを取得するシステムのことです。

解決済

Apacheでオリジン間リソース共有 (CORS)を利用したときに、プリフライト・リクエストが発生するPCと、発生しないPCがある

pom12345
pom12345

総合スコア12

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CORS

CORSとはCross-Origin Resource Sharingの頭文字をとったもので、ブラウザがオリジン以外のサーバからデータを取得するシステムのことです。

1回答

0グッド

1クリップ

461閲覧

投稿2022/10/28 00:51

編集2022/10/28 01:52

実現したいこと

Apacheでオリジン間リソース共有 (CORS)を利用したときに、プリフライト・リクエストが発生するPCと、発生しないPCがあり困っています。

(試したこと)
①apacheのhttpd.confとaxiosのヘッダにより、リクエストが、単純リクエストになるようにし
自分のPCで社内用Webシステムからaxiosでlocalhostにアクセスしたところ、プリフライト・リクエストが発生しなかった。
Google Chromeコンソールに警告なし、何も表示なし。

②他のPCも同じapacheのhttpd.confの設定をして、
同じWebシステムからaxiosでlocalhostにアクセスしたところ、プリフライト・リクエスト?(2回送信)が発生した。
Google Chromeコンソールに警告なし、何も表示なし。

設定での対処方法がなければ、PHPでプリフライトリクエストを判定する方法があればよいのですが。

わかるかたいらっしゃいましたらお願いします。

現在のapacheの設定と、axiosでリクエストするコード

apacheの設定

httpd.conf

1<Directory "C:/xampp/htdocs"> 2 # ... 3 4 Header set Access-Control-Allow-Origin "http://192.168.11.30:3000" 5 Header set Access-Control-Allow-Methods "GET" 6 Header set Access-Control-Allow-Headers "Origin, withcredentials" 7 Header set Access-Control-Allow-Credentials "true" 8</Directory>

axiosでリクエストするコード(localhostに対してgetアクセスしています。localhostはapacheの80ポートを利用)

index.js

1axios({ 2 method: "get", 3 url: "http://localhost", 4 headers: { 5 "Content-Type": "application/x-www-form-urlencoded;" 6 }, 7 params: { value: "GETで渡すパラメーター" } 8}).then((response) => { 9 console.log("ok") 10}).catch((response) => { 11 console.log("ng") 12});

パケットキャプチャソフトによる、プリフライト・リクエストと、2回目のリクエストはこちらです。

// プリフライト・リクエスト(OPTIONS) OPTIONS *** Host: localhost Connection: keep-alive Accept: */* Access-Control-Request-Method: GET Access-Control-Request-Headers: withcredentials User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 Origin: http://192.168.11.30:3000 Sec-Fetch-Site: cross-site Sec-Fetch-Mode: cors Sec-Fetch-Dest: empty Accept-Encoding: gzip, deflate, br Accept-Language: ja,en-US;q=0.9,en;q=0.8 // 2回目のリクエスト GET *** Host: localhost Connection: keep-alive sec-ch-ua: "Google Chrome";v="107", "Chromium";v="107", "Not=A?Brand";v="24" Accept: application/json, text/plain, */* withCredentials: true sec-ch-ua-mobile: ?0 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 sec-ch-ua-platform: "Windows" Origin: http://192.168.11.30:3000 Sec-Fetch-Site: cross-site Sec-Fetch-Mode: cors Sec-Fetch-Dest: empty Accept-Encoding: gzip, deflate, br Accept-Language: ja,en-US;q=0.9,en;q=0.8

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

回答1

0

ベストアンサー

PHPでプリフライトリクエストを判定する方法

プリフライトリクエストはOPTIONSメソッドで行われる、とのことです(MDN)。

投稿2022/10/28 01:31

maisumakun

総合スコア141322

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

pom12345

2022/10/28 01:42 編集

ありがとうございます。 そちらの記事は確認していてOPTIONSメソッドで行っていることも知っており、しかしPHPで判定する方法がよくわかりませんでした。 PCごとの違いでわかったことは、パケットキャプチャソフト(Fiddler)というものをインストールしているかしていないかで、2回発生するか、しないかの違いがありました。 ただし、インストールしてリクエストが2回発生しなくなっても、それは根本的な対策ではないため、 意図的にプリフライト・リクエストを発生させて、パケットキャプチャソフトで確認できるヘッダーがないか調べてみたいと思います。
pom12345

2022/10/28 01:56 編集

PHPコードを検証中ですが、このような気がします。 if ($_SERVER["REQUEST_METHOD"] == "GET"){ // プリフライトリクエストではない2回目のリクエスト(GET)の時の処理 }
pom12345

2022/10/28 01:54

教えて頂きありがとうございます。 $_SERVER["REQUEST_METHOD"] ですね。

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.12%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CORS

CORSとはCross-Origin Resource Sharingの頭文字をとったもので、ブラウザがオリジン以外のサーバからデータを取得するシステムのことです。