Okay, ich habe eine Seite auf und auf dieser Seite habe ich einen Iframe. Was ich tun muss, ist auf der Iframe-Seite herauszufinden, wie die URL der Hauptseite lautet.
Ich habe mich umgesehen und weiß, dass dies nicht möglich ist, wenn sich meine Iframe-Seite in einer anderen Domain befindet, da es sich um Cross-Site-Scripting handelt. Aber überall, wo ich gelesen habe, heißt es, wenn sich die Iframe-Seite in derselben Domäne wie die übergeordnete Seite befindet, sollte sie funktionieren, wenn ich zum Beispiel Folgendes tue:
parent.document.location
parent.window.document.location
parent.window.location
parent.document.location.href
... oder ähnliche Kombinationen, da es mehrere Möglichkeiten zu geben scheint, die gleichen Informationen zu erhalten.
Wie auch immer, hier ist das Problem. Mein Iframe befindet sich in derselben Domain wie die Hauptseite, aber nicht in derselben SUB-Domain. So habe ich zum Beispiel
http: // www.mysite.com/pageA.html
und dann ist meine iframe URL
http: // qa-www.mysite.com/pageB.html
Wenn ich versuche, die URL von pageB.html
(der Iframe-Seite) abzurufen, erhalte ich immer den gleichen Fehler, bei dem der Zugriff verweigert wurde. Es scheint also, dass sogar Subdomains als Cross-Site-Scripting gelten. Ist das richtig oder mache ich etwas falsch?
quelle
<iframe src="url?parent=parent-url"></iframe>
Antworten:
Du hast Recht. Subdomains werden bei Verwendung von Iframes weiterhin als separate Domains betrachtet. Es ist möglich, Nachrichten mit zu übergeben
postMessage(...)
, aber auf andere JS-APIs wird absichtlich nicht zugegriffen.Es ist auch weiterhin möglich, die URL je nach Kontext abzurufen. Weitere Antworten finden Sie in anderen Antworten.
quelle
Ja, der Zugriff auf die URL der übergeordneten Seite ist nicht zulässig, wenn sich der Iframe und die Hauptseite nicht in derselben (Unter-) Domäne befinden. Wenn Sie jedoch nur die URL der Hauptseite (dh die Browser-URL) benötigen, können Sie Folgendes versuchen:
Hinweis:
window.parent.location
ist erlaubt; Es vermeidet den Sicherheitsfehler im OP, der durch den Zugriff auf diehref
Eigenschaftwindow.parent.location.href
verursacht wird : verursacht "Blockierte einen Frame mit Ursprung ..."document.referrer
bezieht sich auf "den URI der Seite, die mit dieser Seite verlinkt ist". Dadurch wird das enthaltene Dokument möglicherweise nicht zurückgegeben , wenn eine andere Quelle deniframe
Speicherort bestimmt hat, z. B.:document.referrer
ist dies Domäne 3 , nicht die enthaltende Domäne 1document.location
bezieht sich auf "ein Standortobjekt, das Informationen über die URL des Dokuments enthält"; vermutlich das aktuelle Dokument, dh der aktuell geöffnete Iframe. Wennwindow.location === window.parent.location
, dann ist der Iframehref
der gleiche wie der des enthaltenden Elternteilshref
.quelle
document.domain
den oberen und den innersten Rahmen einstellen . vielleicht.var url = (parent !== window) ? document.referrer : document.location;
Referer-Policy
Header besiegt werden kann .Ich habe gerade eine Problemumgehung für dieses Problem gefunden, die so einfach ist, und dennoch habe ich nirgendwo Diskussionen gefunden, die dies erwähnen. Es erfordert die Steuerung des übergeordneten Frames.
Angenommen, Sie möchten in Ihrem iFrame diesen Iframe: src = "http://www.example.com/mypage.php"
Nun, anstelle von HTML, um den Iframe anzugeben, verwenden Sie ein Javascript, um den HTML-Code für Ihren Iframe zu erstellen, rufen Sie die übergeordnete URL "zur Erstellungszeit" über Javascript ab und senden Sie sie als URL-GET-Parameter im Querystring Ihres src-Ziels, wie z so:
Suchen Sie sich dann eine Javascript-URL-Analysefunktion, die die URL-Zeichenfolge analysiert, um die URL-Variable zu erhalten, nach der Sie suchen. In diesem Fall handelt es sich um "URL".
Ich habe hier einen großartigen URL-String-Parser gefunden: http://www.netlobo.com/url_query_string_javascript.html
quelle
Wenn Ihr Iframe von einer anderen Domain stammt (domänenübergreifend), müssen Sie einfach Folgendes verwenden:
und - hier hast du die Haupt-URL!
quelle
window.location.reload(true)
) neu geladen hat, funktioniert dies nicht mehr. Dann ist Referrer die URL des Iframes selbst.Für Seiten in derselben Domain und in verschiedenen Subdomains können Sie die
document.domain
Eigenschaft über Javascript festlegen .Sowohl der übergeordnete Frame als auch der Iframe müssen ihre document.domain auf etwas setzen, das zwischen ihnen üblich ist.
dh
www.foo.mydomain.com
undapi.foo.mydomain.com
könnte jeder entwederfoo.mydomain.com
oder nur verwendenmydomain.com
und kompatibel sein (nein, auscom
Sicherheitsgründen können Sie nicht beide einstellen ...)Beachten Sie außerdem, dass document.domain eine Einbahnstraße ist. Führen Sie die folgenden drei Anweisungen nacheinander aus:
Moderne Browser können auch window.postMessage verwenden, um über Ursprünge hinweg zu sprechen, dies funktioniert jedoch nicht in IE6. https://developer.mozilla.org/en/DOM/window.postMessage
quelle
Die folgende Zeile funktioniert:
document.location.ancestorOrigins[0]
Diese gibt den Vorgängerdomänennamen zurück.quelle
document.location.ancestorOrigins
kehrtundefined
für mich zurückVersuch es:
Wenn Sie sich ändern, befinden Sie sich in einem Iframe. Ihr Host ist "Referrer".
quelle
Ich hatte Probleme damit. Wenn Sie beim ersten Laden Ihrer Seite im iframe Grab eine Sprache wie PHP verwenden
$_SERVER['HTTP_REFFERER']
und diese auf eine Sitzungsvariable setzen.Auf diese Weise kennen Sie beim Laden der Seite im Iframe die vollständige übergeordnete URL und Abfragezeichenfolge der Seite, die sie geladen hat. Mit der Cross-Browser-Sicherheit ist es ein bisschen Kopfzerbrechen, wenn Sie auf window.parent irgendetwas setzen, wenn Sie verschiedene Domains haben.
quelle
Ich habe festgestellt, dass das oben vorgeschlagene Beispiel zuvor funktioniert hat, als das Skript in einem Iframe ausgeführt wurde. Es hat jedoch die URL nicht abgerufen, als das Skript außerhalb eines Iframes ausgeführt wurde. Eine geringfügige Anpassung war erforderlich:
quelle
Ich konnte die vorherige Lösung nicht zum Laufen bringen, aber ich fand heraus, dass ich
http:otherdomain.com/page.htm?from=thisdomain.com/thisfolder
im iframe-Extraktthisdomain.com/thisfolder
mit folgendem Javascript Folgendes tun könnte, wenn ich beispielsweise das iframe-Skript mit einstelle :quelle
Das Problem mit PHP $ _SERVER ['HTTP_REFFERER'] besteht darin, dass die vollständig qualifizierte Seiten-URL der Seite angegeben wird, die Sie zur übergeordneten Seite geführt hat. Das ist nicht dasselbe wie die übergeordnete Seite. Schlimmer noch, manchmal gibt es keinen http_referer, weil die Person die URL der übergeordneten Seite eingegeben hat. Wenn ich also von yahoo.com zu Ihrer übergeordneten Seite komme, wird yahoo.com zum http_referer und nicht zu Ihrer Seite.
quelle
Ich habe in den Fällen, in denen
$_SERVER['HTTP_REFERER']
nicht funktioniert (ich sehe dich an, Safari),$_SERVER['REDIRECT_SCRIPT_URI']
eine nützliche Sicherung gefunden.quelle
In Chrome ist es möglich, location.ancestorOrigins zu verwenden. Es werden alle übergeordneten URLs zurückgegeben
quelle
Ich weiß, dass er super alt ist, aber es ist unglaublich, dass niemand empfohlen hat, nur Cookies von einer Domain zur anderen zu übertragen. Während Sie Subdomains verwenden, können Sie Cookies von einer Basisdomain für alle Subdomains freigeben, indem Sie einfach Cookies auf die URL setzen
.basedomain.com
Dann können Sie alle benötigten Daten über die Cookies teilen.
quelle
Dies funktionierte für mich, um auf die iframe src-URL zuzugreifen.
quelle
Holen Sie sich alle übergeordneten Iframe-Funktionen und HTML
quelle