Maison  >  Article  >  développement back-end  >  Pourquoi le serveur API de mon sous-domaine génère-t-il une erreur CORS ?

Pourquoi le serveur API de mon sous-domaine génère-t-il une erreur CORS ?

Patricia Arquette
Patricia Arquetteoriginal
2024-10-30 01:39:03724parcourir

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

Échec de l'accès au sous-domaine à partir du domaine principal : en-tête 'Access-Control-Allow-Origin' manquant

Résumé du problème

Lors de l'accès au serveur API d'un sous-domaine à partir du domaine principal, une erreur de politique CORS est rencontrée : "Aucun en-tête 'Access-Control-Allow-Origin' n'est présent sur la ressource demandée."

Considérations relatives à la vérification en amont

Avant d'explorer des solutions potentielles, il est crucial de vérifier la demande de contrôle en amont à l'aide des Chrome DevTools pour exclure les problèmes de mise en cache et identifier le type de demande approprié pour un dépannage plus approfondi.

Étapes de diagnostic

  • Inspecter les paramètres CORS : Assurez-vous que le code côté serveur implémente correctement CORS et ajoute les en-têtes необхідné.
  • Vérifier l'interception du proxy : Déterminez si des proxys inverses interfèrent avec la transmission de l'en-tête Access-Control-Allow-Origin.
  • Examinez le déploiement de l'application : Vérifiez que l'application hébergeant le serveur API est déployée correctement, car une erreur 502 Bad Gateway peut indiquer des problèmes de déploiement.

Exemples de code

Pendant que l'option 1 fonctionne En l'état, les exemples suivants visent à démontrer différentes approches pour résoudre les problèmes CORS :

Option 2 : Middleware CORS personnalisé

<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>

Option 3 : Middleware CORS de la bibliothèque externe

<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>

Résolution

Dans le cas spécifique du problème donné, il a été découvert que le problème provenait d'une charge AWS incorrecte Paramètres du groupe cible de l'équilibreur, en particulier une mauvaise configuration du protocole en tant que HTTPS lorsque les certificats n'étaient attribués qu'à Route 53 et ALB. Changer le protocole en HTTP a résolu le problème.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn