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

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

新規登録して質問してみよう
ただいま回答率
85.53%
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の頭文字をとったもので、ブラウザがオリジン以外のサーバからデータを取得するシステムのことです。

Q&A

解決済

1回答

1370閲覧

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

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の頭文字をとったもので、ブラウザがオリジン以外のサーバからデータを取得するシステムのことです。

0グッド

1クリップ

投稿2022/10/28 00:51

編集2022/10/28 10:56

実現したいこと

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

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

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

投稿2022/10/28 01:31

maisumakun

総合スコア145019

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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"] ですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.53%

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

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

質問する

関連した質問