Ok, mam stronę na tej stronie i iframe. Co muszę zrobić, to na stronie iframe dowiedzieć się, jaki jest adres URL strony głównej.
Szukałem i wiem, że nie jest to możliwe, jeśli moja strona iframe znajduje się w innej domenie, ponieważ jest to skrypt między witrynami. Ale wszędzie, gdzie czytałem, mówi, że jeśli strona iframe znajduje się w tej samej domenie co strona nadrzędna, powinna działać, jeśli na przykład:
parent.document.location
parent.window.document.location
parent.window.location
parent.document.location.href
... lub inne podobne kombinacje, ponieważ wydaje się, że istnieje wiele sposobów uzyskania tych samych informacji.
W każdym razie, więc jest problem. Mój iframe znajduje się w tej samej domenie co strona główna, ale nie w tej samej domenie SUB. Tak na przykład mam
http: // www.mysite.com/pageA.html
a następnie mój URL iframe to
http: // qa-www.mysite.com/pageB.html
Gdy próbuję pobrać adres URL z pageB.html
(strony iframe), ciągle pojawia się ten sam błąd odmowy dostępu. Wygląda więc na to, że nawet subdomeny liczą się jako skrypty między witrynami, czy to prawda, czy robię coś złego?
źródło
<iframe src="url?parent=parent-url"></iframe>
Odpowiedzi:
Masz rację. Subdomeny są nadal uważane za osobne domeny podczas korzystania z ramek iframe. Możliwe jest przekazywanie wiadomości przy użyciu
postMessage(...)
, ale inne interfejsy API JS celowo stają się niedostępne.Nadal można uzyskać adres URL w zależności od kontekstu. Zobacz inne odpowiedzi, aby uzyskać więcej informacji.
źródło
Tak, dostęp do adresu URL strony nadrzędnej jest niedozwolony, jeśli ramka iframe i strona główna nie znajdują się w tej samej (pod) domenie. Jeśli jednak potrzebujesz tylko adresu URL strony głównej (tj. Adresu URL przeglądarki), możesz spróbować:
Uwaga:
window.parent.location
jest dozwolone; pozwala uniknąć błędu bezpieczeństwa w OP, który jest spowodowany dostępem dohref
właściwości:window.parent.location.href
powoduje „Zablokowano ramkę z początkiem ...”document.referrer
odnosi się do „identyfikatora URI strony, która prowadzi do tej strony”. To może nie zwrócić dokumentu zawierającego, jeśli inne źródło określiłoiframe
lokalizację, na przykład:document.referrer
będzie to Domena 3 , a nie Domena zawierająca 1document.location
odnosi się do „obiektu lokalizacji, który zawiera informacje o adresie URL dokumentu”; prawdopodobnie obecny dokument, czyli iframe obecnie otwarty. Kiedywindow.location === window.parent.location
, wtedy iframehref
jest taki sam jak zawierający rodzichref
.źródło
document.domain
na górnej i wewnętrznej ramie. może.var url = (parent !== window) ? document.referrer : document.location;
Referer-Policy
nagłówka.Właśnie odkryłem obejście tego problemu, które jest tak proste, a jednak nigdzie nie znalazłem żadnych dyskusji na ten temat. Wymaga kontroli nadrzędnej ramki.
W ramce iFrame powiedz, że chcesz tę ramkę iframe: src = "http://www.example.com/mypage.php"
Cóż, zamiast HTML do określenia iframe, użyj javascript do zbudowania HTML dla twojego iframe, pobierz URL-a nadrzędnego przez javascript „w czasie kompilacji” i wyślij go jako parametr GET url w zapytaniu twojego obiektu src, jak więc:
Następnie znajdź sobie funkcję parsowania adresu URL javascript, która analizuje ciąg adresu URL, aby uzyskać zmienną adresu URL, której szukasz, w tym przypadku jest to „url”.
Znalazłem świetny parser ciągów adresów URL tutaj: http://www.netlobo.com/url_query_string_javascript.html
źródło
Jeśli element iframe pochodzi z innej domeny (między domenami), wystarczy użyć tego:
i - tutaj masz główny adres URL!
źródło
window.location.reload(true)
), To już nie działa. Następnie strona odsyłająca to adres URL samego elementu iframe.W przypadku stron w tej samej domenie i innej subdomenie możesz ustawić tę
document.domain
właściwość za pomocą javascript.Zarówno ramka nadrzędna, jak i ramka iframe muszą ustawić swoją dokument.domain na coś, co jest między nimi wspólne.
tzn.
www.foo.mydomain.com
iapi.foo.mydomain.com
każdy może używać albofoo.mydomain.com
albo tylkomydomain.com
i być kompatybilny (nie, nie można ustawić ich obu zecom
względów bezpieczeństwa ...)zauważ również, że document.domain to ulica jednokierunkowa. Rozważ uruchomienie następujących trzech instrukcji w kolejności:
Nowoczesne przeglądarki mogą także korzystać z window.postMessage do komunikowania się między źródłami, ale nie będzie działać w IE6. https://developer.mozilla.org/en/DOM/window.postMessage
źródło
Działa następujący wiersz:
document.location.ancestorOrigins[0]
ten zwraca nazwę domeny przodka.źródło
document.location.ancestorOrigins
wracaundefined
do mnieSpróbuj:
Po zmianie jesteś w ramce iframe, twój host jest „polecającym”.
źródło
Miałem z tym problemy. Jeśli używasz języka takiego jak php, gdy strona ładuje się po raz pierwszy w ramce iframe,
$_SERVER['HTTP_REFFERER']
ustaw ją na zmienną sesyjną.W ten sposób, gdy strona ładuje się do ramki iframe, znasz pełny nadrzędny adres URL i ciąg zapytania strony, która go załadowała. Dzięki bezpieczeństwu w różnych przeglądarkach jest trochę kłopotliwy, licząc na window.parent wszystko, jeśli masz różne domeny.
źródło
Odkryłem, że powyższy sugerowany przykład działał wcześniej, gdy skrypt był wykonywany w ramce iframe, jednak nie pobierał adresu URL, gdy skrypt był wykonywany poza ramką iframe, wymagana była niewielka korekta:
źródło
Nie mogłem sprawić, aby poprzednie rozwiązanie działało, ale dowiedziałem się, że jeśli ustawię np. Iframe scr
http:otherdomain.com/page.htm?from=thisdomain.com/thisfolder
, to w ekstrakcie iframe mógłbym to zrobićthisdomain.com/thisfolder
za pomocą następującego javascript:źródło
Problem z PHP $ _SERVER ['HTTP_REFFERER'] polega na tym, że podaje on w pełni kwalifikowany URL strony, która doprowadziła cię do strony nadrzędnej. To nie to samo, co sama strona nadrzędna. Co gorsza, czasami nie ma http_referer, ponieważ osoba wpisała adres URL strony nadrzędnej. Jeśli więc przejdę na twoją stronę nadrzędną z yahoo.com, wtedy yahoo.com stanie się http_referer, a nie twoją stroną.
źródło
Znalazłem w przypadkach, w których
$_SERVER['HTTP_REFERER']
nie działa (patrzę na ciebie, Safari),$_SERVER['REDIRECT_SCRIPT_URI']
był przydatną kopią zapasową.źródło
W chrome można użyć location.ancestorOrigins Zwróci wszystkie adresy URL rodziców
źródło
Wiem, że jest on bardzo stary, ale budzi to w moich myślach nikt nie zalecał przekazywania plików cookie z jednej domeny do drugiej. Podczas korzystania z subdomen możesz udostępniać pliki cookie z domeny podstawowej do wszystkich subdomen po prostu ustawiając pliki cookie na adres URL
.basedomain.com
Następnie możesz udostępniać potrzebne dane za pomocą plików cookie.
źródło
To działało dla mnie, aby uzyskać dostęp do adresu URL iframe src.
źródło
Uzyskaj wszystkie funkcje nadrzędnego elementu iframe i HTML
źródło