Gagal Mengakses Subdomain daripada Domain Utama: Pengepala 'Access-Control-Allow-Origin' Tiada
Ringkasan Masalah
Apabila mengakses pelayan API subdomain daripada domain utama, ralat dasar CORS ditemui: "Tiada pengepala 'Access-Control-Allow-Origin' hadir pada sumber yang diminta."
Pertimbangan Semakan Pra-Penerbangan
Sebelum menyelidiki kemungkinan penyelesaian, adalah penting untuk mengesahkan permintaan pra-penerbangan menggunakan Chrome DevTools untuk menolak isu caching dan mengenal pasti jenis permintaan yang sesuai untuk penyelesaian masalah selanjutnya.
Langkah Diagnostik
Contoh Kod
Sementara Pilihan 1 berfungsi apa adanya, contoh berikut bertujuan untuk menunjukkan pendekatan yang berbeza untuk menyelesaikan isu CORS:
Pilihan 2: Perisian Tengah CORS Tersuai
<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>
Pilihan 3: CORS Middleware daripada Perpustakaan Luar
<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>
Resolusi
Dalam kes khusus masalah yang diberikan, didapati bahawa isu itu berpunca daripada Muatan AWS yang salah Tetapan Kumpulan Sasaran Pengimbang, khususnya salah konfigurasi protokol sebagai HTTPS apabila sijil hanya diberikan kepada Laluan 53 dan ALB. Menukar protokol kepada HTTP telah menyelesaikan masalah.
Atas ialah kandungan terperinci Mengapa Pelayan API Subdomain Saya Melemparkan Ralat CORS?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!