“不允許 CORS 多源” - 使用 parse-server 和 apache2
我使用 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-Origin
apache 配置中的選項會阻止初始請求通過解析伺服器,因此這不是一個選項。我正在使用 apache2 版本
2.4.29
和 parse-server4.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
這樣,您可以模擬對後端服務的請求並查看它發送的標頭。