Truy cập URL cha từ iframe


187

Được rồi, tôi có một trang trên và trên trang này tôi có iframe. Những gì tôi cần làm là trên trang iframe, tìm hiểu URL của trang chính là gì.

Tôi đã tìm kiếm xung quanh và tôi biết rằng điều này là không thể nếu trang iframe của tôi nằm trên một tên miền khác, vì đó là kịch bản chéo trang. Nhưng ở mọi nơi tôi đã đọc đều nói rằng nếu trang iframe nằm trên cùng một tên miền với trang mẹ, thì nó sẽ hoạt động nếu tôi làm như vậy:

parent.document.location
parent.window.document.location
parent.window.location
parent.document.location.href

... Hoặc các combo tương tự khác, vì dường như có nhiều cách để có được thông tin tương tự.

Dù sao, đây là vấn đề. Khung nội tuyến của tôi nằm trên cùng một tên miền với trang chính, nhưng nó không nằm trên cùng một tên miền SUB. Vì vậy, ví dụ tôi có

http: // www.mysite.com/pageA.html

và sau đó URL iframe của tôi là

http: // qa-www.mysite.com/pageB.html

Khi tôi cố lấy URL từ pageB.html(trang iframe), tôi tiếp tục nhận được cùng một lỗi truy cập bị từ chối. Vì vậy, có vẻ như ngay cả các tên miền phụ cũng được tính là kịch bản chéo trang, điều đó có đúng không, hay tôi đang làm gì đó sai?


Bạn chỉ có thể vượt qua nó trong URL khung? Chẳng hạn như<iframe src="url?parent=parent-url"></iframe>
Biagio Arobba

Câu trả lời:


21

Bạn hoàn toàn đúng. Tên miền con vẫn được coi là tên miền riêng khi sử dụng iframe. Có thể truyền thông điệp bằng cách sử dụng postMessage(...), nhưng các API JS khác được cố ý không thể truy cập được.

Bạn vẫn có thể nhận URL tùy theo ngữ cảnh. Xem câu trả lời khác để biết thêm chi tiết.


1
Được rồi mà chỉ cần thổi. Nhưng ít nhất tôi biết tôi sẽ không phát điên :( ah tốt, kế hoạch B. cảm ơn. (Và xin lỗi về việc không đưa công cụ của tôi vào thẻ, cảm ơn vì đã chỉnh sửa)
chronofwar

9
Làm thế nào đây là câu trả lời được lựa chọn? có nhiều mô tả tốt hơn về các giải pháp có thể dưới đây.
Anoyz

1
Đã đồng ý! Câu trả lời dưới đây với 80 phiếu tốt hơn nhiều. Câu trả lời này là trong thông số html.
Ligemer

4
bạn CÓ THỂ tương tác giữa 2. Nhưng bạn phải thêm tập lệnh sau vào cả cha và iframe: <script> document.domain = "mydomain.com"; </ script>
George

2
"Xem câu trả lời khác để biết thêm chi tiết." hahah Giống như: Tôi không có bất kỳ giải pháp nào, xem các câu trả lời khác, nhưng cũng chấp nhận câu trả lời của tôi.
Milad

370

Có, không được phép truy cập URL của trang mẹ nếu iframe và trang chính không nằm trong cùng một tên miền (phụ). Tuy nhiên, nếu bạn chỉ cần URL của trang chính (tức là URL trình duyệt), bạn có thể thử điều này:

var url = (window.location != window.parent.location)
            ? document.referrer
            : document.location.href;

Ghi chú:

window.parent.locationđược cho phép; nó tránh được lỗi bảo mật trong OP, nguyên nhân là do truy cập vào thuộc hreftính: window.parent.location.hrefgây ra "Bị chặn khung có nguồn gốc ..."

document.referrerđề cập đến "URI của trang được liên kết đến trang này." Điều này có thể không trả về tài liệu chứa nếu một số nguồn khác xác định iframevị trí, ví dụ:

  • Container iframe @ Miền 1
  • Gửi iframe con đến Miền 2
  • Nhưng trong iframe con ... Miền 2 chuyển hướng sang Miền 3 (nghĩa là để xác thực, có thể là SAML), và sau đó Miền 3 chuyển trở lại Miền 2 (tức là thông qua việc gửi biểu mẫu (), một kỹ thuật SAML tiêu chuẩn)
  • Đối với iframe con document.referrersẽ là Miền 3 , không phải Miền 1 chứa

document.locationđề cập đến "một đối tượng Vị trí, chứa thông tin về URL của tài liệu"; có lẽ là tài liệu hiện tại , nghĩa là iframe hiện đang mở. Khi window.location === window.parent.locationthì iframe của hrefcùng như phụ huynh chứa là href.


1
@jepser đó là vì iframe của bạn nằm trong iframe đó. bạn sẽ không bao giờ có quyền truy cập vào khung trên cùng với khung ở giữa. iframe chéo lồng nhau là sai trên nhiều cấp độ. nhưng bạn có thể có được xung quanh đó nếu bạn đặt document.domainở khung trên cùng và bên trong nhất. có lẽ.
gcb

2
Hoặc, gọn hơn một chút:var url = (parent !== window) ? document.referrer : document.location;
thekingoftruth

2
Xin lưu ý rằng nó không hoạt động nếu vùng chứa nằm trên localhost của bạn (hoặc nói chung hơn, nếu trang này không được mở bởi máy chủ web) hoặc được gọi bằng tệp: //.
Guillaume Renoult

5
Cần lưu ý rằng điều này có thể bị đánh bại với Referer-Policytiêu đề.
Dan Atkinson

2
Điều này dường như không hoạt động với trình duyệt Edge - người giới thiệu sẽ là một chuỗi trống .. stackoverflow.com/questions/24169219/
mẹo

51

Tôi mới phát hiện ra một cách giải quyết cho vấn đề này rất đơn giản, nhưng tôi chưa tìm thấy bất kỳ cuộc thảo luận nào ở bất cứ nơi nào đề cập đến nó. Nó không yêu cầu kiểm soát khung cha.

Trong iFrame của bạn, giả sử bạn muốn iframe này: src = "http://www.example.com/mypage.php"

Chà, thay vì HTML để chỉ định iframe, hãy sử dụng javascript để xây dựng HTML cho iframe của bạn, lấy url gốc thông qua javascript "tại thời điểm xây dựng" và gửi nó dưới dạng tham số GET trong chuỗi truy vấn của mục tiêu src của bạn, như vì thế:

<script type="text/javascript">
  url = parent.document.URL;
  document.write('<iframe src="http://example.com/mydata/page.php?url=' + url + '"></iframe>');
</script>

Sau đó, tìm cho mình một chức năng phân tích cú pháp url javascript để phân tích chuỗi url để lấy biến url bạn đang theo sau, trong trường hợp này là "url".

Tôi đã tìm thấy một trình phân tích cú pháp chuỗi url tuyệt vời ở đây: http://www.netlobo.com/url_query_opes_javascript.html


Câu trả lời này kết hợp với stackoverflow.com/a/7739035/216084 hoàn thành công việc.

2
Đây là một gợi ý tuyệt vời. Đối với những người đang viết mã iframe html, điều này sẽ giúp thanh toán hóa đơn. Chúng tôi đã sử dụng một cái gì đó rất giống nhau trong phần mềm pixel của chúng tôi.
Ligemer

Cảm ơn bạn!! Đây là một công việc hiệu quả mà vẫn tôn trọng các quy tắc chéo trang web.
theStherSide

Nhưng bạn có viết lại tất cả các url trong html ở máy chủ không? Bởi vì nếu không, khi người dùng nhấp vào một liên kết trong iFrame, nó sẽ vẫn không thể truy cập được.
Roel

@Roel bạn có thể viết tất cả chúng vào thời gian máy chủ (về bản chất là "mã cứng" câu trả lời này) hoặc câu trả lời này bạn có thể làm trong javascript, ví dụ sau khi trang tải nó tiêm iframe mong muốn.
rogerdpack

34

Nếu iframe của bạn đến từ một tên miền khác, (tên miền chéo), bạn chỉ cần sử dụng điều này:

var currentUrl = document.referrer;

và - ở đây bạn đã có url chính!


Điều đó đã không hoạt động trong trường hợp của tôi vì tôi nghĩ rằng chính iFrame đã được tạo động hoặc thực hiện một số mánh khóe khác. Tôi đã không nhận được câu trả lời tôi mong đợi ở mức nào.
Xạ thủ

cái này sẽ hoạt động trong tất cả các trình duyệt. Trừ khi trong các trình duyệt mới hơn nếu bạn gửi tham số Sandboxing, nhưng tôi nghi ngờ đây là trường hợp. Điều này hoạt động bất kể tên miền chéo.
gcb

Nếu trang bên trong iframe tự tải lại thông qua javascript (ví dụ window.location.reload(true)) thì trang này không hoạt động nữa. Sau đó, tham chiếu là URL của iframe chính nó.
mori

20

Đối với các trang trên cùng một tên miền và tên miền phụ khác nhau, bạn có thể đặt thuộc document.domaintính qua javascript.

Cả khung chính và iframe đều cần đặt document.domain của chúng thành một cái gì đó phổ biến để tạo ra chúng.

tức là www.foo.mydomain.comapi.foo.mydomain.commỗi người có thể sử dụng một trong hai foo.mydomain.comhoặc chỉ mydomain.comvà tương thích (không, bạn không thể đặt cả hai thành com, vì lý do bảo mật ...)

Ngoài ra, lưu ý rằng document.domain là đường một chiều. Xem xét chạy ba câu lệnh sau theo thứ tự:

// assume we're starting at www.foo.mydomain.com
document.domain = "foo.mydomain.com" // works
document.domain = "mydomain.com" // works
document.domain = "foo.mydomain.com" // throws a security exception

Các trình duyệt hiện đại cũng có thể sử dụng window.postMessage để nói về nguồn gốc, nhưng nó sẽ không hoạt động trong IE6. https://developer.mozilla.org/en/DOM/window.postMessage


3
Vui lòng chấp nhận đây là câu trả lời, vì bây giờ điều này là có thể và câu trả lời này sẽ xuất hiện trong các tìm kiếm của Google.
Nhà siêu âm

17

Dòng sau sẽ hoạt động: document.location.ancestorOrigins[0]dòng này trả về tên miền tổ tiên.


Sau những thay đổi được thực hiện cho Chrome, đây hiện là câu trả lời chính xác cho rất nhiều trình duyệt.
Dan Atkinson

Không phải là url đầy đủ mặc dù. Chỉ tên miền
TheMaster 22/07/19

document.location.ancestorOriginstrả lại undefinedcho tôi
Miguel Mota

9

Thử nó:

document.referrer

Khi bạn thay đổi, bạn đang ở trong iframe, máy chủ của bạn là "người giới thiệu".


2

Tôi đã có vấn đề với điều này. Nếu sử dụng ngôn ngữ như php khi trang của bạn tải lần đầu tiên trong iframe lấy $_SERVER['HTTP_REFFERER']và đặt nó thành biến phiên.

Bằng cách này khi trang tải trong iframe bạn biết toàn bộ url cha và chuỗi truy vấn của trang đã tải nó. Với bảo mật trình duyệt chéo, sẽ hơi đau đầu khi đếm trên window.parent bất cứ điều gì nếu bạn có các tên miền khác nhau.


2
var url = (window.location != window.parent.location) ? document.referrer: document.location;

Tôi thấy rằng ví dụ trên được đề xuất trước đây hoạt động khi tập lệnh đang được thực thi trong iframe tuy nhiên nó không lấy được url khi tập lệnh được thực thi bên ngoài iframe, cần phải điều chỉnh một chút:

var url = (window.location != window.parent.location) ? document.referrer: document.location.href;

2
Nếu bạn ở ngoài iframe thì bạn đang chạy tập lệnh ON khung cha, bạn không cần kiểm tra bất cứ điều gì.
Art3mix

1

Tôi không thể làm cho giải pháp trước đó hoạt động nhưng tôi phát hiện ra rằng nếu tôi đặt iframe Scr chẳng hạn http:otherdomain.com/page.htm?from=thisdomain.com/thisfolderthì tôi có thể, trong trích xuất iframe thisdomain.com/thisfolderbằng cách sử dụng javascript sau:

var myString = document.location.toString();
var mySplitResult = myString.split("=");
fromString = mySplitResult[1];

1

Vấn đề với PHP $ _SERVER ['HTTP_REFFERER'] là nó cung cấp url trang đủ điều kiện của trang đưa bạn đến trang mẹ. Điều đó không giống với trang chính. Tồi tệ hơn, đôi khi không có http_Vferer, vì người đó đã nhập url của trang mẹ. Vì vậy, nếu tôi truy cập trang mẹ của bạn từ yahoo.com, thì yahoo.com sẽ trở thành http_Vferer chứ không phải trang của bạn.


1

Tôi đã tìm thấy trong các trường hợp $_SERVER['HTTP_REFERER']không hoạt động (Tôi đang nhìn bạn, Safari), $_SERVER['REDIRECT_SCRIPT_URI']là một bản sao lưu hữu ích.


0

Trong chrome, có thể sử dụng location.ancestorOrigins Nó sẽ trả về tất cả các url cha


0

Tôi biết anh ấy rất già nhưng điều đó làm tôi suy nghĩ không ai khuyên bạn nên chuyển cookie từ tên miền này sang tên miền khác. Vì bạn đang sử dụng tên miền phụ, bạn có thể chia sẻ cookie từ một tên miền cơ bản đến tất cả các tên miền phụ chỉ bằng cách đặt cookie vào url.basedomain.com

Sau đó, bạn có thể chia sẻ bất kỳ dữ liệu nào bạn cần thông qua các cookie.



-4

Nhận tất cả các hàm Iframe của cha mẹ và HTML

var parent = $(window.frameElement).parent();
        //alert(parent+"TESTING");
        var parentElement=window.frameElement.parentElement.parentElement.parentElement.parentElement;
        var Ifram=parentElement.children;      
        var GetUframClass=Ifram[9].ownerDocument.activeElement.className;
        var Decision_URLLl=parentElement.ownerDocument.activeElement.contentDocument.URL;

Tôi không cho rằng bạn có thể mở rộng câu trả lời này cho những người trong chúng ta không sử dụng jQuery (số lượng ngày càng tăng, tôi nên chỉ ra, vì jQuery đã trở nên không cần thiết trong vài năm qua). Ít nhất, tôi khuyên bạn nên làm rõ câu trả lời này phụ thuộc vào jQuery và OP hoàn toàn không đề cập đến jQuery.
Carnix
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.