首页 > 后端开发 > Golang > 正文

为什么我的子域的 API 服务器会抛出 CORS 错误?

Patricia Arquette
发布: 2024-10-30 01:39:03
原创
797 人浏览过

Why Is My Subdomain's API Server Throwing a CORS Error?

无法从主域访问子域:缺少“Access-Control-Allow-Origin”标头

问题摘要

从主域访问子域的 API 服务器时,遇到 CORS 策略错误:“请求的资源上不存在 'Access-Control-Allow-Origin' 标头。”

预检检查注意事项

在深入研究潜在的解决方案之前,使用 Chrome DevTools 验证预检请求以排除缓存问题并确定适当的请求类型以进一步排除故障至关重要。

诊断步骤

  • 检查 CORS 设置: 确保服务器端代码正确实现 CORS 并添加 необхідné 标头。
  • 检查代理拦截:确定是否有任何反向代理干扰 Access-Control-Allow-Origin 标头的传输。
  • 检查应用程序部署:验证托管 API 服务器的应用程序是否已正确部署,因为 502 Bad Gateway 错误可能表示部署问题。

代码示例

虽然选项 1 有效按原样,以下示例旨在演示解决 CORS 问题的不同方法:

选项 2:自定义 CORS 中间件

<code class="go">package main

import (
    &quot;log&quot;
    &quot;net/http&quot;

    &quot;github.com/gin-gonic/gin&quot;
)

func main() {
    r := gin.New()
    r.Use(CORS())

    r.POST(&quot;/api/v1/users&quot;, func(ctx *gin.Context) {
        ctx.JSON(http.StatusOK, gin.H{&quot;message&quot;: &quot;OK&quot;})
    })

    if err := r.Run(); err != nil {
        log.Printf(&quot;failed to start server: %v&quot;, err)
    }
}

func CORS() gin.HandlerFunc {
    return func(c *gin.Context) {
        c.Writer.Header().Set(&quot;Access-Control-Allow-Origin&quot;, &quot;*&quot;)
        c.Writer.Header().Set(&quot;Access-Control-Allow-Credentials&quot;, &quot;true&quot;)
        c.Writer.Header().Set(&quot;Access-Control-Allow-Headers&quot;, &quot;Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization, accept, origin, Cache-Control, X-Requested-With&quot;)
        c.Writer.Header().Set(&quot;Access-Control-Max-Age&quot;, &quot;86400&quot;)
        if c.Request.Method == http.MethodOptions {
            c.AbortWithStatus(http.StatusNoContent)
            return
        }
        c.Next()
    }
}</code>
登录后复制

选项 3:来自外部库的 CORS 中间件

<code class="go">package main

import (
    &quot;log&quot;

    &quot;github.com/gin-contrib/cors&quot;
    &quot;github.com/gin-gonic/gin&quot;
)

func main() {
    router := gin.Default()

    router.Use(cors.New(cors.Config{
        AllowOrigins:     []string{&quot;*&quot;},
        AllowMethods:     []string{&quot;GET&quot;, &quot;POST&quot;, &quot;PUT&quot;, &quot;DELETE&quot;},
        AllowHeaders:     []string{&quot;*&quot;},
        ExposeHeaders:    []string{&quot;Content-Length&quot;},
        AllowCredentials: true,
        MaxAge:           86400,
    }))

    router.GET(&quot;/api/v1/users&quot;, func(c *gin.Context) {
        c.JSON(200, gin.H{&quot;message&quot;: &quot;OK&quot;})
    })

    if err := router.Run(); err != nil {
        log.Printf(&quot;failed to start server: %v&quot;, err)
    }
}</code>
登录后复制

解决方案

在给定问题的特定情况下,发现问题源于不正确的 AWS 负载Balancer 目标组设置,特别是当证书仅分配给 Route 53 和 ALB 时,将协议错误配置为 HTTPS。将协议更改为 HTTP 解决了问题。

以上是为什么我的子域的 API 服务器会抛出 CORS 错误?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板