Golang多個域名的跨域資源共享的實現(xiàn)
在 Golang 中,處理多個域名的跨域資源共享 (CORS) 可以通過動態(tài)檢查 Origin 并設(shè)置響應(yīng)頭來實現(xiàn)。以下是基于 Golang 的實現(xiàn)示例。
1. 動態(tài)判斷域名并設(shè)置 CORS
根據(jù)請求的 Origin,判斷是否允許,并動態(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. 使用第三方庫 (Gin 框架)
如果使用 Gin,可以通過中間件實現(xiàn)動態(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 請求,提前返回
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 實現(xiàn)多個域名 CORS
如果使用 Nginx 作為反向代理,CORS 的域名過濾可以在 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;
}
}
注意事項
OPTIONS 請求處理:
- OPTIONS 請求是瀏覽器發(fā)送的預(yù)檢請求,用于檢查是否允許跨域。
- 必須對 OPTIONS 請求快速響應(yīng),返回 204 狀態(tài)碼。
安全性:
- 確保只允許可信的
Origin。 - 防止 CORS 頭注入漏洞,嚴(yán)格驗證請求頭。
- 確保只允許可信的
Access-Control-Allow-Credentials限制:- 如果設(shè)置
Access-Control-Allow-Credentials: true,Access-Control-Allow-Origin不能是*,必須指定具體的域名。
- 如果設(shè)置
到此這篇關(guān)于Golang多個域名的跨域資源共享的實現(xiàn)的文章就介紹到這了,更多相關(guān)Golang 跨域資源共享內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
golang elasticsearch Client的使用詳解
這篇文章主要介紹了golang elasticsearch Client的使用詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-05-05
一文帶你理解Golang中的Time結(jié)構(gòu)
根據(jù)golang的time包的文檔可以知道,golang的time結(jié)構(gòu)中存儲了兩種時鐘,一種是Wall?Clocks,一種是Monotonic?Clocks,下面我們就來簡單了解一下這兩種結(jié)構(gòu)吧2023-09-09
基于Go+OpenCV實現(xiàn)人臉識別功能的詳細(xì)示例
OpenCV是一個強大的計算機視覺庫,提供了豐富的圖像處理和計算機視覺算法,本文將向你介紹在Mac上安裝OpenCV的步驟,并演示如何使用Go的OpenCV綁定庫進行人臉識別,需要的朋友可以參考下2023-07-07
Golang如何調(diào)用windows下的dll動態(tài)庫中的函數(shù)
這篇文章主要介紹了Golang如何調(diào)用windows下的dll動態(tài)庫中的函數(shù)方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-05-05

