我有一個托管在 中的后端https://api.mydomain.abc,我正在使用使用 webpack 服務器的 vue/quasar CLI 開發前端。
當前端在開發模式下運行時,它由 webpack Web 服務器托管,并且前端代碼中的 url 具有/api/index.php格式。然后配置 webpack 服務器將它們代理到真正的后端 url:
devServer: {
...,
proxy: {
// proxy all requests starting with /api to avoid cors problems.
'/api': {
target: 'https://api.mydomain.abc',
changeOrigin: true,
pathRewrite: {
'^/api': '' //remove /api from the final url
}
}
}
},
在生產模式下運行時,前端由 NGINX 服務器托管,https://www.mydomain.abc前端的 url 現在直接類似于https://api.mydomain.abc.
從現在開始,兩種請求型別(開發和生產)都是相同的。https://api.mydomain.abc請求由同一個 NGINX 服務器偵聽,但現在作為反向代理作業,將它們重定向到帶有 PHP mod 的 apache 服務器。這里有一個非常簡單的純 PHP 腳本,沒有任何外部框架或庫,它只是管理登錄并在用戶正確登錄時從 DB 回傳一些動態值。
關鍵是在開發環境中一切正常,但在生產環境中所有登錄保護請求都失敗了,因為 $_SESSION 陣列為空!!
我完全不知道什么會導致這種錯誤,因為后端對于兩種環境都是一樣的。
更多資訊:
- CORS 標頭在 apache 服務器中設定以允許來自www.mydomain.abc(以及 mydomain.abc)的請求,并且沒有任何 CORS 錯誤。
- 兩種環境都使用
https協議訪問后端 - 我的 PHP 腳本
session_start()在腳本開始時無條件運行
我已經嘗試過這個答案,但沒有觀察到任何變化。
是什么導致了這兩種環境之間的這種差異?除了 webpack 服務器之外,它們實際上是相同的。
uj5u.com熱心網友回復:
我會自己回答。問題是在開發程序中,瀏覽器在 localhost url 中,向 localhost 服務器發出請求(webpack 服務器,然后將其代理到真正的 api 生產服務器,但瀏覽器不知道這一點)。這是same-origin瀏覽器的環境,因此fetchAPI 將憑據 (phpsessioncookie) 發送到服務器,因為這是same-origin環境中的默認行為。
在生產環境中,webpack 服務器沒有參與進來,瀏覽器正在(www.)mydomain.com向api.mydomain.com. 這里的問題是,即使(www.)mydomain.com在 API Web 服務器中被設定為允許的來源,對于瀏覽器來說,它也是一個cross-origin環境,這意味著fetchAPI 默認不發送憑據。credentials:include覆寫默認值并發送它們。
如果標頭Access-Control-Allow-Credentials: "true"不存在,則服務器端也需要標頭。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/347549.html
標籤:php 阿帕奇 会议 会话变量 webpack-dev-server
上一篇:FacebookMessenger應用回呼不會呼叫我的應用
下一篇:為什么我在django中收到錯誤“django.db.utils.OperationalError:沒有這樣的表:”?
