Golang多個(gè)域名的跨域資源共享的實(shí)現(xiàn)
在 Golang 中,處理多個(gè)域名的跨域資源共享 (CORS) 可以通過(guò)動(dòng)態(tài)檢查 Origin
并設(shè)置響應(yīng)頭來(lái)實(shí)現(xiàn)。以下是基于 Golang 的實(shí)現(xiàn)示例。
1. 動(dòng)態(tài)判斷域名并設(shè)置 CORS
根據(jù)請(qǐng)求的 Origin
,判斷是否允許,并動(dòng)態(tài)設(shè)置 Access-Control-Allow-Origin
。
示例代碼
package main import ( "net/http" ) func main() { allowedOrigins := []string{ "https://example1.com", "https://example2.com", "https://example3.com", } http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { origin := r.Header.Get("Origin") for _, o := range allowedOrigins { if origin == o { w.Header().Set("Access-Control-Allow-Origin", origin) w.Header().Set("Access-Control-Allow-Credentials", "true") w.Header().Set("Access-Control-Allow-Methods", "GET, POST, OPTIONS") w.Header().Set("Access-Control-Allow-Headers", "Content-Type, Authorization") break } } // Handle preflight request if r.Method == http.MethodOptions { w.WriteHeader(http.StatusNoContent) return } // Example response for other requests w.Write([]byte("CORS configured!")) }) http.ListenAndServe(":8080", nil) }
2. 使用第三方庫(kù) (Gin 框架)
如果使用 Gin,可以通過(guò)中間件實(shí)現(xiàn)動(dòng)態(tài)域名的 CORS。
示例代碼
package main import ( "github.com/gin-gonic/gin" ) func main() { allowedOrigins := []string{ "https://example1.com", "https://example2.com", "https://example3.com", } r := gin.Default() // 自定義中間件處理 CORS r.Use(func(c *gin.Context) { origin := c.Request.Header.Get("Origin") for _, o := range allowedOrigins { if origin == o { c.Writer.Header().Set("Access-Control-Allow-Origin", origin) c.Writer.Header().Set("Access-Control-Allow-Credentials", "true") c.Writer.Header().Set("Access-Control-Allow-Methods", "GET, POST, OPTIONS") c.Writer.Header().Set("Access-Control-Allow-Headers", "Content-Type, Authorization") break } } // 如果是 OPTIONS 請(qǐng)求,提前返回 if c.Request.Method == "OPTIONS" { c.AbortWithStatus(204) return } c.Next() }) r.GET("/", func(c *gin.Context) { c.JSON(200, gin.H{"message": "CORS configured!"}) }) r.Run(":8080") }
3. Nginx 配合 Golang 實(shí)現(xiàn)多個(gè)域名 CORS
如果使用 Nginx 作為反向代理,CORS 的域名過(guò)濾可以在 Nginx 層處理。具體配置如下:
示例 Nginx 配置
server { listen 80; server_name yourdomain.com; location / { set $cors ""; if ($http_origin ~* "(https://example1\.com|https://example2\.com|https://example3\.com)") { set $cors $http_origin; } add_header Access-Control-Allow-Origin $cors; add_header Access-Control-Allow-Credentials true; add_header Access-Control-Allow-Methods "GET, POST, OPTIONS"; add_header Access-Control-Allow-Headers "Content-Type, Authorization"; # Pass the request to your Golang app proxy_pass http://127.0.0.1:8080; } }
注意事項(xiàng)
OPTIONS 請(qǐng)求處理:
- OPTIONS 請(qǐng)求是瀏覽器發(fā)送的預(yù)檢請(qǐng)求,用于檢查是否允許跨域。
- 必須對(duì) OPTIONS 請(qǐng)求快速響應(yīng),返回 204 狀態(tài)碼。
安全性:
- 確保只允許可信的
Origin
。 - 防止 CORS 頭注入漏洞,嚴(yán)格驗(yàn)證請(qǐng)求頭。
- 確保只允許可信的
Access-Control-Allow-Credentials
限制:- 如果設(shè)置
Access-Control-Allow-Credentials: true
,Access-Control-Allow-Origin
不能是*
,必須指定具體的域名。
- 如果設(shè)置
到此這篇關(guān)于Golang多個(gè)域名的跨域資源共享的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Golang 跨域資源共享內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
golang elasticsearch Client的使用詳解
這篇文章主要介紹了golang elasticsearch Client的使用詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-05-05Go語(yǔ)言L(fǎng)eetCode題解1046最后一塊石頭的重量
這篇文章主要為大家介紹了Go語(yǔ)言L(fǎng)eetCode題解1046最后一塊石頭的重量,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12一文帶你理解Golang中的Time結(jié)構(gòu)
根據(jù)golang的time包的文檔可以知道,golang的time結(jié)構(gòu)中存儲(chǔ)了兩種時(shí)鐘,一種是Wall?Clocks,一種是Monotonic?Clocks,下面我們就來(lái)簡(jiǎn)單了解一下這兩種結(jié)構(gòu)吧2023-09-09基于Go+OpenCV實(shí)現(xiàn)人臉識(shí)別功能的詳細(xì)示例
OpenCV是一個(gè)強(qiáng)大的計(jì)算機(jī)視覺(jué)庫(kù),提供了豐富的圖像處理和計(jì)算機(jī)視覺(jué)算法,本文將向你介紹在Mac上安裝OpenCV的步驟,并演示如何使用Go的OpenCV綁定庫(kù)進(jìn)行人臉識(shí)別,需要的朋友可以參考下2023-07-07Golang分布式注冊(cè)中心實(shí)現(xiàn)流程講解
這篇文章主要介紹了Golang分布式注冊(cè)中心實(shí)現(xiàn)流程,注冊(cè)中心可以用于服務(wù)發(fā)現(xiàn),服務(wù)注冊(cè),配置管理等方面,在分布式系統(tǒng)中,服務(wù)的發(fā)現(xiàn)和注冊(cè)是非常重要的組成部分,需要的朋友可以參考下2023-05-05Golang如何調(diào)用windows下的dll動(dòng)態(tài)庫(kù)中的函數(shù)
這篇文章主要介紹了Golang如何調(diào)用windows下的dll動(dòng)態(tài)庫(kù)中的函數(shù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-05-05Go語(yǔ)言基礎(chǔ)函數(shù)基本用法及示例詳解
這篇文章主要為大家介紹了Go語(yǔ)言基礎(chǔ)函數(shù)基本用法及示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2021-11-11