


Was Ihnen der PHP-Editor Xiaoxin heute vorstellen wird, ist ein häufiges Problem bei der Netzwerkentwicklung: Auf die Subdomain kann von der Hauptdomäne aus nicht zugegriffen werden, und es tritt der Fehler „Access-Control-Allow-Origin“ auf. Dieses Problem tritt häufig bei der Frontend-Entwicklung auf, insbesondere bei domänenübergreifenden Anfragen. Dies führt häufig dazu, dass die Anfrage vom Browser abgefangen wird und die erforderlichen Daten nicht ordnungsgemäß abgerufen werden können. In diesem Artikel erläutern wir die Ursache und Lösung dieses Fehlers im Detail, um Ihnen dabei zu helfen, dieses Problem schnell zu lösen und den normalen Betrieb des Projekts sicherzustellen.
Frageninhalt
Version
go 1.17 github.com/gin-contrib/cors v1.3.1 github.com/gin-gonic/gin v1.7.7
Frage
Ich verwende den Gin Rest API-Server in meiner Subdomain.
Die React-Anwendung wird in der Hauptdomäne platziert und verwendet die Get-Methode und die Post-Methode, um auf den API-Server zuzugreifen. Ich erhalte jedoch einen Cors-Richtlinienfehler. access to xmlhttprequest at 'https://<subdomain>.<domain>.xxx/api/v1/users' from origin 'https:// /<domain>.xxx' 已被 cors 策略阻止:对预检请求的响应未通过访问控制检查:请求的资源.</domain></domain></subdomain>
Der Header „access-control-allow-origin“ ist darauf nicht vorhanden.
Bei der Websuche habe ich das gleiche Problem und einige Lösungen gefunden, aber sie haben in meinem Fall nicht funktioniert.
Code
Bei all diesen Programmen tritt der gleiche Fehler auf.
Fall 1
package gateway import ( "log" "github.com/gin-contrib/cors" "github.com/gin-gonic/gin" ) func runserver() { r := gin.default() r.use(cors.default()) api := r.group("/api") v1 := api.group("/v1") userrouters(v1) err := r.run() if err != nil { log.printf("failed to run gateway: %v", err) } }
Fall 2
package gateway import ( "log" "time" "github.com/gin-contrib/cors" "github.com/gin-gonic/gin" ) func runserver() { r := gin.default() r.use(cors.new(cors.config{ alloworigins: []string{"*"}, allowmethods: []string{"get", "post", "put", "delete"}, allowheaders: []string{"content-type"}, allowcredentials: false, maxage: 12 * time.hour, })) api := r.group("/api") v1 := api.group("/v1") userrouters(v1) err := r.run() if err != nil { log.printf("failed to run gateway: %v", err) } }
Fall 3
access-control-allow-origin fehlt im Antwortheader. · Ausgabe Nr. 29 · gin-contrib/cors
package gateway import ( "log" "github.com/gin-gonic/gin" ) 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-allow-methods", "post, options, get, put, delete") if c.request.method == "options" { c.abortwithstatus(204) return } c.next() } } func runserver() { r := gin.default() r.use(cors()) api := r.group("/api") v1 := api.group("/v1") userrouters(v1) err := r.run() if err != nil { log.printf("failed to run gateway: %v", err) } }
Abheben vom Terminal
> curl 'https://alb.skhole.club/api/v1/authz' \ -X 'OPTIONS' \ -H 'authority: alb.skhole.club' \ -H 'accept: */*' \ -H 'accept-language: ja,en-US;q=0.9,en;q=0.8' \ -H 'access-control-request-headers: content-type' \ -H 'access-control-request-method: POST' \ -H 'cache-control: no-cache' \ -H 'origin: https://skhole.club' \ -H 'pragma: no-cache' \ -H 'referer: https://skhole.club/' \ -H 'sec-fetch-dest: empty' \ -H 'sec-fetch-mode: cors' \ -H 'sec-fetch-site: same-site' \ -H 'user-agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36' \ --compressed -i HTTP/2 502 server: awselb/2.0 date: Wed, 05 Apr 2023 04:04:13 GMT content-type: text/html content-length: 524 <html> <head><title>502 Bad Gateway</title></head> <body> <center><h1 id="Bad-Gateway">502 Bad Gateway</h1></center> </body> </html> <!-- a padding to disable MSIE and Chrome friendly error page --> <!-- a padding to disable MSIE and Chrome friendly error page --> <!-- a padding to disable MSIE and Chrome friendly error page --> <!-- a padding to disable MSIE and Chrome friendly error page --> <!-- a padding to disable MSIE and Chrome friendly error page --> <!-- a padding to disable MSIE and Chrome friendly error page -->
Gelöst
Dies wird durch die aws_lb_target_group
-Einstellung verursacht.
Obwohl ich das ACM-Zertifikat nur für Route 53 und Alb bereitgestellt habe, habe ich in der Zielgruppe das Protokoll https eingestellt.
Ich habe https durch http ersetzt und jetzt funktioniert es.
Problemumgehung
Der erste Schritt bei der Diagnose dieser Art von Problem besteht darin, die Preflight-Anfragen direkt in Chrome Devtools zu überprüfen.
Notizen:
- Überprüfen
disable cache
, ob die Preflight-Antwort zwischengespeichert ist. - Suchen Sie nach Anfragen des Typs
preflight
.
Der nächste Schritt besteht darin, die Preflight-Anfrage als curl
命令(右键单击请求,在上下文菜单中选择 copy
->copy as curl)并直接使用 curl
工具测试请求(记得修改命令添加-i
Option zum Drucken von Antwortheadern zu kopieren.
Anscheinend tritt dieses Problem in einer Produktionsumgebung auf. Der Reverse-Proxy zwischen dem Browser und Ihrem Dienst blockiert möglicherweise standardmäßig den access-control-allow-origin
-Header. Versuchen Sie, die Preflight-Anfrage direkt an Ihren Dienst zu senden und prüfen Sie, ob das einen Unterschied macht.
Update (nach Bereitstellung einer Preflight-Antwort):
Es stellte sich heraus, dass dies überhaupt kein Cors-Problem ist. Die Anfrage ist mit dem Statuscode 502 bad gateway
fehlgeschlagen. Die Anwendung wurde nicht korrekt bereitgestellt.
Übrigens habe ich Fall 1 getestet und es funktioniert:
package main import ( "log" "net/http/httputil" "github.com/gin-contrib/cors" "github.com/gin-gonic/gin" ) func main() { r := gin.default() r.use(cors.default()) api := r.group("/api") v1 := api.group("/v1") v1.post("users", func(ctx *gin.context) { buf, err := httputil.dumprequest(ctx.request, true) if err != nil { log.printf("failed to dump request: %v", err) return } log.printf("%s", buf) }) err := r.run() if err != nil { log.printf("failed to run gateway: %v", err) } r.run() }
$ curl 'http://localhost:8080/api/v1/users' \ -X 'OPTIONS' \ -H 'Accept: */*' \ -H 'Accept-Language: en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7,zh-TW;q=0.6' \ -H 'Access-Control-Request-Headers: content-type' \ -H 'Access-Control-Request-Method: POST' \ -H 'Cache-Control: no-cache' \ -H 'Connection: keep-alive' \ -H 'Origin: http://127.0.0.1:5501' \ -H 'Pragma: no-cache' \ -H 'Referer: http://127.0.0.1:5501/' \ -H 'Sec-Fetch-Dest: empty' \ -H 'Sec-Fetch-Mode: cors' \ -H 'Sec-Fetch-Site: cross-site' \ -H 'User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36' \ --compressed -i HTTP/1.1 204 No Content Access-Control-Allow-Headers: Origin,Content-Length,Content-Type Access-Control-Allow-Methods: GET,POST,PUT,PATCH,DELETE,HEAD,OPTIONS Access-Control-Allow-Origin: * Access-Control-Max-Age: 43200 Date: Wed, 05 Apr 2023 03:50:06 GMT
Das obige ist der detaillierte Inhalt vonVon der Hauptdomäne aus kann nicht auf die Subdomäne zugegriffen werden: Kein „Access-Control-Allow-Origin'. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Golang eignet sich besser für hohe Parallelitätsaufgaben, während Python mehr Vorteile bei der Flexibilität hat. 1. Golang behandelt die Parallelität effizient über Goroutine und Kanal. 2. Python stützt sich auf Threading und Asyncio, das von GIL betroffen ist, jedoch mehrere Parallelitätsmethoden liefert. Die Wahl sollte auf bestimmten Bedürfnissen beruhen.

Die Leistungsunterschiede zwischen Golang und C spiegeln sich hauptsächlich in der Speicherverwaltung, der Kompilierungsoptimierung und der Laufzeiteffizienz wider. 1) Golangs Müllsammlung Mechanismus ist praktisch, kann jedoch die Leistung beeinflussen.

Wählen SieGolangforHighperformanceConcurcurrency, idealforbackendServicesandNetworkProgramming; selectPythonforrapidDevelopment, DataScience und MachinelearningDuEToSverseStilityAntenSiveselibrary.

Golang und Python haben jeweils ihre eigenen Vorteile: Golang ist für hohe Leistung und gleichzeitige Programmierung geeignet, während Python für Datenwissenschaft und Webentwicklung geeignet ist. Golang ist bekannt für sein Parallelitätsmodell und seine effiziente Leistung, während Python für sein Ökosystem für die kurze Syntax und sein reiches Bibliothek bekannt ist.

In welchen Aspekten sind Golang und Python einfacher zu verwenden und haben eine glattere Lernkurve? Golang eignet sich besser für hohe Parallelitäts- und hohe Leistungsbedürfnisse, und die Lernkurve ist für Entwickler mit C -Sprachhintergrund relativ sanft. Python eignet sich besser für Datenwissenschaft und schnelles Prototyping, und die Lernkurve ist für Anfänger sehr reibungslos.

Golang und C haben jeweils ihre eigenen Vorteile bei Leistungswettbewerben: 1) Golang ist für eine hohe Parallelität und schnelle Entwicklung geeignet, und 2) C bietet eine höhere Leistung und eine feinkörnige Kontrolle. Die Auswahl sollte auf Projektanforderungen und Teamtechnologie -Stack basieren.

Golang eignet sich für eine schnelle Entwicklung und gleichzeitige Programmierung, während C für Projekte, die eine extreme Leistung und die zugrunde liegende Kontrolle erfordern, besser geeignet sind. 1) Golangs Parallelitätsmodell vereinfacht die Parallelitätsprogrammierung durch Goroutine und Kanal. 2) Die Vorlagenprogrammierung von C bietet generische Code und Leistungsoptimierung. 3) Golangs Müllsammlung ist bequem, kann jedoch die Leistung beeinflussen. Die Speicherverwaltung von C ist komplex, aber die Kontrolle ist in Ordnung.

GoimpactsDevelopmentPositivyThroughSpeed, Effizienz und DiasMlitication.1) Geschwindigkeit: Gocompilesquickandrunseffiction, idealforlargeProjects


Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

EditPlus chinesische Crack-Version
Geringe Größe, Syntaxhervorhebung, unterstützt keine Code-Eingabeaufforderungsfunktion

WebStorm-Mac-Version
Nützliche JavaScript-Entwicklungstools

Sicherer Prüfungsbrowser
Safe Exam Browser ist eine sichere Browserumgebung für die sichere Teilnahme an Online-Prüfungen. Diese Software verwandelt jeden Computer in einen sicheren Arbeitsplatz. Es kontrolliert den Zugriff auf alle Dienstprogramme und verhindert, dass Schüler nicht autorisierte Ressourcen nutzen.

SublimeText3 Englische Version
Empfohlen: Win-Version, unterstützt Code-Eingabeaufforderungen!

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung