无法从主域访问子域:缺少“Access-Control-Allow-Origin”标头
问题摘要
从主域访问子域的 API 服务器时,遇到 CORS 策略错误:“请求的资源上不存在 'Access-Control-Allow-Origin' 标头。”
预检检查注意事项
在深入研究潜在的解决方案之前,使用 Chrome DevTools 验证预检请求以排除缓存问题并确定适当的请求类型以进一步排除故障至关重要。
诊断步骤
代码示例
虽然选项 1 有效按原样,以下示例旨在演示解决 CORS 问题的不同方法:
选项 2:自定义 CORS 中间件
<code class="go">package main import ( "log" "net/http" "github.com/gin-gonic/gin" ) func main() { r := gin.New() r.Use(CORS()) r.POST("/api/v1/users", func(ctx *gin.Context) { ctx.JSON(http.StatusOK, gin.H{"message": "OK"}) }) if err := r.Run(); err != nil { log.Printf("failed to start server: %v", err) } } func CORS() gin.HandlerFunc { return func(c *gin.Context) { c.Writer.Header().Set("Access-Control-Allow-Origin", "*") c.Writer.Header().Set("Access-Control-Allow-Credentials", "true") c.Writer.Header().Set("Access-Control-Allow-Headers", "Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization, accept, origin, Cache-Control, X-Requested-With") c.Writer.Header().Set("Access-Control-Max-Age", "86400") if c.Request.Method == http.MethodOptions { c.AbortWithStatus(http.StatusNoContent) return } c.Next() } }</code>
选项 3:来自外部库的 CORS 中间件
<code class="go">package main import ( "log" "github.com/gin-contrib/cors" "github.com/gin-gonic/gin" ) func main() { router := gin.Default() router.Use(cors.New(cors.Config{ AllowOrigins: []string{"*"}, AllowMethods: []string{"GET", "POST", "PUT", "DELETE"}, AllowHeaders: []string{"*"}, ExposeHeaders: []string{"Content-Length"}, AllowCredentials: true, MaxAge: 86400, })) router.GET("/api/v1/users", func(c *gin.Context) { c.JSON(200, gin.H{"message": "OK"}) }) if err := router.Run(); err != nil { log.Printf("failed to start server: %v", err) } }</code>
解决方案
在给定问题的特定情况下,发现问题源于不正确的 AWS 负载Balancer 目标组设置,特别是当证书仅分配给 Route 53 和 ALB 时,将协议错误配置为 HTTPS。将协议更改为 HTTP 解决了问题。
以上是为什么我的子域的 API 服务器会抛出 CORS 错误?的详细内容。更多信息请关注PHP中文网其他相关文章!