亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

盡管為 Nginx、angular-http-server 和 Golang 啟用了

盡管為 Nginx、angular-http-server 和 Golang 啟用了

Go
qq_遁去的一_1 2023-06-12 16:40:11
我已經在開發中成功啟用了 CORS。我的 Golang 后端與本地計算機上的 Angular 前端通信良好。但是,我不知道如何在生產環境中啟用 CORS(DigitalOcean 上的 Ubuntu)。我在 Firefox 上得到這個:“跨源請求被阻止:同源策略不允許讀取位于http://localhost:12345/anteroom 的遠程資源。(原因:CORS 請求未成功)?!蔽艺谑褂?systemd 單元運行 Golang 后端,并在 localhost:12345 提供服務。我使用 PM2 和 angular-http-server 將 Angular 前端作為構建(使用--prod標志構建)運行,并通過端口 8080 提供服務。此端口位于防火墻后面。我使用 Nginx 來處理這個前端的 HTTPS 流量。它在端口 80 上偵聽并proxy_pass在端口 8080 上將 ( ) 請求傳遞給它。登陸頁面(只需要一個 GET 請求)在瀏覽器中加載正常,所以這個設置似乎是可行的。我正在使用的版本:Ubuntu 16.04、PM2 3.3.1、Angular CLI 7.3.4、angular-http-server 1.8.1。當前端嘗試將 JSON 數據 POST 到后端(localhost:12345/anteroom,如上面的消息所示)時,就會出現問題。我讀過 CORS 是服務器端問題。因此,我嘗試在有服務器的任何地方啟用它,即在后端、Nginx 和 angular-http-server 中啟用它。它在我的 Golang 代碼中啟用:func anteroom(res http.ResponseWriter, req *http.Request) {    res.Header().Set("Access-Control-Allow-Origin", "*")    res.Header().Set("Access-Control-Allow-Methods", "POST, OPTIONS")    res.Header().Set("Access-Control-Allow-Headers", "Content-Type")    res.Header().Set("Content-Type", "application/json")...}func main() {    ...    # Using Gorilla mux router.    router := mux.NewRouter()    router.HandleFunc("/anteroom", anteroom).Methods("POST", "OPTIONS")}這成功地在開發中啟用了 CORS,其中服務 Golang 只是打開其構建的二進制文件,而 Angular 使用ng serve.以上在生產中是不夠的。所以,我嘗試使用 angular-http-server 啟用它。注意--cors最后的標志:pm2 start $(which angular-http-server) --name app -- --path /PATH/TO/DIST -p 8080 --cors我還嘗試在與 Angular 前端構建相關的 Nginx 文件中啟用它(改編自此處):location / {if ($request_method = 'OPTIONS') {        add_header 'Access-Control-Allow-Origin' '*';        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';        add_header 'Access-Control-Allow-Headers' 'Content-Type';        add_header 'Content-Type' 'application/json';        return 204;}}我查看了 PM2、angular-http-server、Nginx 和其他一些東西的文檔,但我不知道我遺漏了什么。讓我知道?謝謝。
查看完整描述

2 回答

?
尚方寶劍之說

TA貢獻1788條經驗 獲得超4個贊

我使用 tcpdump 查看來回的標頭。長話短說,在某些時候它讓我意識到我將前端設置為與“本地主機”通信。顯然,這意味著使用前端的任何客戶端瀏覽器都將在其自己的本地計算機上查找它。

為了解決這個問題,我為我的角度前端設置了單獨的應用程序環境。這允許前端在暫存中與本地主機通信,在生產中與我的后端域通信。


查看完整回答
反對 回復 2023-06-12
?
Smart貓小萌

TA貢獻1911條經驗 獲得超7個贊

    func anteroom(res http.ResponseWriter, req *http.Request) {

    res.Header().Set("Access-Control-Allow-Origin", "*")

    res.Header().Set("Access-Control-Allow-Methods", "POST, OPTIONS")

    res.Header().Set("Access-Control-Allow-Headers", "Content-Type")

    res.Header().Set("Content-Type", "application/json")

...

}


func main() {

    ...

    # Using Gorilla mux router.

    router := mux.NewRouter()

    router.HandleFunc("/anteroom", anteroom).Methods("POST", "OPTIONS")

}

代碼中缺少 GET 方法。


將此行更改 res.Header().Set("Access-Control-Allow-Methods", "POST, OPTIONS")為res.Header().Set("Access-Control-Allow-Methods", "GET, POST, OPTIONS")


查看完整回答
反對 回復 2023-06-12
  • 2 回答
  • 0 關注
  • 169 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號