Apache-2.4

“不允許 CORS 多源” - 使用 parse-server 和 apache2

  • January 15, 2022

我使用 apache2 作為我的解析伺服器的反向代理。為了允許跨域請求,我最初嘗試設置:

Header always set Access-Control-Allow-Origin "*"

在 apache 配置文件中連同:

ProxyPass /parse/ http://localhost:1337/parse/
ProxyPassReverse /parse/ http://localhost:1337/parse/
RewriteEngine On
RewriteCond %{REQUEST_METHOD} OPTIONS
RewriteRule ^(.*)$ $1 [R=200,L]

設置後,請求成功地從 apache 轉發到我的解析伺服器。但是現在我的 Webapp 拋出CORS Multiple Origin Not Allowed.

在我的瀏覽器的開發者控制台中,我可以看到這個 Access-Control-Allow-Origin 選項設置了兩次。

在此處輸入圖像描述

我已經確認第二個實例是由於解析伺服器而出現的。但是,我找不到阻止 parse-server 或 apache 在響應中設置此選項的方法。

我嘗試將 apache 配置中的初始行更改為:

Header always setifempty Access-Control-Allow-Origin "*"
Header always add Access-Control-Allow-Origin "*"
Header always add Access-Control-Allow-Origin "*"
Header always edit Access-Control-Allow-Origin "^$" "*"

這些嘗試都沒有改變任何東西。但是,刪除Access-Control-Allow-Originapache 配置中的選項會阻止初始請求通過解析伺服器,因此這不是一個選項。

我正在使用 apache2 版本2.4.29和 parse-server 4.10.3

有誰知道讓這個工作的方法?

首先,我認為了解 CORS 工作原理的一些背景知識很重要:

  • CORS 由瀏覽器在客戶端進行驗證。
  • 為了驗證一個源(不同的域、協議或埠)是否被允許訪問另一個源,可以在實際的跨源請求之前發出飛行前請求。此請求使用 OPTIONS 方法,並且需要Access-Control在響應中包含標頭。

那麼我為什麼這麼說:我懷疑您需要Access-Control-Allow-Origin在 Apache 中設置標頭以使請求“通過”的原因是您的 Apache 配置不是代理OPTION請求。這會導致瀏覽器在飛行前請求中獲得意外響應,並在嘗試發出實際請求之前拋出 CORS 錯誤。

由於 CORS 在瀏覽器中經過驗證,因此 Apache 反向代理不應在其中發揮任何作用。當您的後端伺服器(解析伺服器)正確配置為處理 CORS 請求並發出正確的Access-Control-*標頭時,無論您在其間放置多少代理,一切都應該正常工作。只要代理轉發所有請求。

或者,您可能希望在反向代理中“添加”CORS 配置,但這在這裡似乎沒有必要。由於您Access-Control-Allow-Origin在響應中看到兩個標頭,我懷疑解析伺服器實際上已經在嘗試處理 CORS 請求。

我建議您首先檢查您的 Apache 配置並確保OPTION將請求轉發到解析伺服器。如果不應該這樣,我會查看瀏覽器在開發工具的網路選項卡中發出的請求:

  • 飛行前請求看起來如何?甚至有飛行前的要求嗎?
  • 它是成功還是失敗,有什麼錯誤?
  • Access-Control-*飛行前請求的響應標頭是什麼?
  • 是否發出最終請求?該請求的響應標頭是什麼?

您還可以curl通過設置源頭來呼叫服務來調試這些東西。

curl -v -X PUT -H "Origin: https://example.com" https://www.example.org

這樣,您可以模擬對後端服務的請求並查看它發送的標頭。

引用自:https://serverfault.com/questions/1078707