添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

公司有2台主機
1台網域是www.公司.com.tw
1台網域是book.公司.com.tw

www這台是主網頁
book是放產品目錄的電子書
www主網頁的產品介紹頁設定iframe去連接book的頁面

因為公司希望使用者不要在電子書頁面掛網太久,設定時間倒數跳回首頁
使用javascript寫了這個功能
畫面上只要觸發滑鼠移動.點擊事件就把時間倒數重計
可是這個功能在iframe區塊內必須要同源才能觸發

我參考了這個網頁
https://blog.darkthread.net/blog/document-domain-to-avoid-sop/
在主網頁跟電子書網頁的body最底端都設定document.domain="公司.com.tw"
F12主控台還是出現這個訊息
Blocked a frame with origin "http://www.公司.com.tw" from accessing a cross-origin frame.
有時候重新整理後不會出現這錯誤訊息,但是滑鼠移動點擊這些事件依然無法觸發

以下是網頁的程式碼
主網頁

<title>A19_ch01</title> </head> <div id="div_iframe"> <iframe src="http://book.公司.com.tw/books/preview/BOOK1/index.html" id="iframeID" width="50%" height="50%" marginwidth="0" marginheight="0" scrolling="No" frameborder="0"></iframe> <script type="text/javascript" src="/javascript/jquery-1.9.1.min.js"></script> <script type="text/javascript"> var idleTime = 0;//時間計算 $(document).ready(function () { var div_if = document.getElementById('div_iframe'); var iframe = document.getElementById('iframeID'); //Increment the idle time counter every minute. var idleInterval = setInterval(timerIncrement, 1000); // 1 second //Zero the idle timer on mouse movement. $(this).mousemove(function (e) { idleTime = 0; console.log("thismove"); $(this).keypress(function (e) { idleTime = 0; console.log("thispress"); div_if.onclick = function () { console.log("iframe外層div"); idleTime = 0; iframe.contentWindow.onmousemove = function (e) { console.log("onmove"); idleTime = 0; }.bind(this); iframe.contentWindow.ontouchmove = function (e) { console.log("ontouchmove"); idleTime = 0; }.bind(this); iframe.contentWindow.document.body.onclick =function () { console.log("iframe clicked"); function timerIncrement() { idleTime++; if (idleTime > 300) { // 300秒觸發 alert("閒置太久沒使用"); document.location.href="首頁網址"; </script> <script> document.domain = "公司.com.tw"; </script> </body> </html>

電子書頁面

<title>TEST</title> <meta http-equiv="Access-Control-Allow-Origin" content="http://www.公司.com.tw:80"> </head> //電子書內容.... <script src="javascript/jquery-1.9.1.min.js"></script> <script> document.domain = "公司.com.tw"; </script> </body> </html>

請問這是因為我設定錯位置
還是這功能已經不支援了?

20200520
參考了這2個網站
https://www.cnblogs.com/fengyuqing/p/javascript_xmlhttp.html
https://support.microsoft.com/zh-tw/help/954002/how-to-add-a-custom-http-response-header-to-a-web-site-that-is-hosted
在IIS設定了Access-Control-Allow-Origin(windows server2003版的IIS)
https://upload.cc/i1/2020/05/20/7RVoeI.jpg
以及在電子書頁面的head內加上(補在上面那段了)

在主網頁的$(document).ready雖然沒跳出錯誤,但還是沒觸發功能
另外在主網頁下面新增了window.onload做測試
window.onload這邊就出現訊息
Blocked a frame with origin "http://www.公司.com.tw" from accessing a cross-origin frame.

<script>
        window.onload = function () {
            var iframe = document.getElementById('iframeID');
            iframe.contentWindow.onmousemove = function (e) {
                console.log("onmove2");
            }.bind(this);
    </script>

還需要做什麼設定嗎?

var div_if = $('#div_iframe');

回來正題:
第一招:可以用修改發送hrader的方式來解決這個問題。
這招是要兩邊的主機都要能自行控制才行。
詳細可查查「cors」去做調整。基本建議用這招。

第二招:改變一下路由的規則。讓兩邊都能存在同一個域名。
這樣就不會被限制到了。
當然,這樣改有時可能還是有難度。畢竟路由規則都已經固定了。

第三招:第三路徑資料請求。由於你的是只有子域名不一樣。可以試著用cookie的方式。先宣告共用主域名。然後兩邊採用cookie記錄的方式。只是這樣主頁面也得要一個計時器來做檢查也麻煩。

第四招:放棄iframe,改採用html顯示模式處理。

以上是大致上的招式。基本如果有主機操作權的話。我會建議用第一招會比較單純點。

先設定 * 試試看能否正常。
再做域名限制。
基本我都會設定以下這四個。

header('Access-Control-Allow-Origin', '*')
header('Access-Control-Allow-Methods', '*')
header('Access-Control-Allow-Headers', 'Origin, Methods, Content-Type, Authorization')
header('Access-Control-Allow-Credentials', true)

先確定能跑後,再開始做限制微調。
第三條可以不用設。那是auth用的

header('Access-Control-Allow-Origin', '*') header('Access-Control-Allow-Methods', '*') header('Access-Control-Allow-Headers', 'Origin, Methods, Content-Type, Authorization') header('Access-Control-Allow-Credentials', true) 先確定能跑後,再開始做限制微調。 第三條可以不用設。那是auth用的
<meta http-equiv="Access-Control-Allow-Origin" content="*">
<meta http-equiv="Access-Control-Allow-Origin" content="http://域名:80">

雖然我沒這樣用過,iis的話我是不太清楚。
不過一般我用nginx是可以針對域名發送這些標頭。

<meta http-equiv="Access-Control-Allow-Origin" content="*"> <meta http-equiv="Access-Control-Allow-Origin" content="http://域名:80"> 雖然我沒這樣用過,iis的話我是不太清楚。 不過一般我用nginx是可以針對域名發送這些標頭。 </head> 測試還是一樣出現Blocked a frame with origin "http://www.公司.com.tw" from accessing a cross-origin frame. 參考了這個 https://coder.tw/?p=7188 下載CURL檢查,在book電腦檢查自己狀態 ![https://upload.cc/i1/2020/05/22/761qmn.jpg](https://upload.cc/i1/2020/05/22/761qmn.jpg) 沒有顯示Access-Control-Allow-Origin 且connection狀態是close,是這個原因嗎?