Wie kann ich über eine Cross-Domain AJAX-Anfrage auf den Header inhaltlich inhaltlich zugreifen?
-
27-10-2019 - |
Frage
Meine JavaScript -Anwendung muss die Länge einer Ressource bestimmen Vor Herunterladen mit Ajax. Normalerweise ist dies kein Problem, Sie stellen nur eine Kopfanfrage und extrahieren die Content-Length
.
var xhr = $.ajax({type:"HEAD", url: "http://own-domain/file.html"})
xhr.getResponseHeader("Content-Length")
// "2195"
Die Ressourcen werden jedoch auf einem anderen Server als Client gespeichert. (Ein Server, den ich steuere). Daher verwende ich CORs, um Cross -Domain AJAX -Anforderungen zu erstellen, und habe den Server so eingerichtet, dass er auf Anfragen für Kopfanfragen und Anforderungen mit benutzerdefinierten Headern vorgezogen wird.
Das funktioniert in der Hauptsache hervorragend, aber ich kann keinen Weg finden Content-Length
Aus der Kopfreaktion bei der Arbeit mit CORs:
var xhr = $.ajax({type:"HEAD", url: "http://other-domain/file.html"})
xhr.getResponseHeader("Content-Length")
// ERROR: Refused to get unsafe header "Content-Length"
Ich habe mit dem Einstellen verschiedener Header im Vorflug oder in der Antwort experimentiert, wie z.
Access-Control-Expose-Headers: Content-Length
Was die Spezifikation zu vermuten scheint, sollte es verfügbar machen. Aber egal was ich tue, ich kann den Header der Inhaltslänge dem Kunden nicht zur Verfügung stellen. Irgendwelche Vorschläge?
(Chrom 8)
Lösung
Ich habe festgestellt, dass CORS -Antwort -Header -Unterstützung in allen Browsern fehlerhaft ist. In Chrome/Safari sehe ich nur einfache Reaktionsheader (http://www.w3.org/tr/cors/#terminology) im Ergebnis von GetAllResponseHeaders (), auch wenn der Header "Access-Control-Expose-Header" ist in der Antwort eingestellt. Und in Firefox 3.6.13 gibt GetAllresponseHeaders () nichts zurück (nicht einmal einfache Antwort -Header). Als Problemumgehung könnten Sie eine der einfachen Reaktionsüberschriften überlasten, um die Inhaltslänge einzuschließen, aber dies kann andere Probleme verursachen und würde Firefox immer noch nicht beheben.
Andere Tipps
Ich hatte das gleiche Problem, bis ich woanders einen Thread fand, der mir beigebracht hat, diese Zeile auf meinem .htaccess hinzuzufügen:
Header add Access-Control-Expose-Headers "Content-Length"
Dann boom, es wurde repariert.