การป้องกันการแคช iframe ในเบราว์เซอร์


88

คุณจะป้องกันไม่ให้ Firefox และ Safari แคชเนื้อหา iframe ได้อย่างไร

ฉันมีหน้าเว็บธรรมดาที่มี iframe ไปยังหน้าในไซต์อื่น ทั้งเพจด้านนอกและเพจด้านในมีส่วนหัวการตอบสนอง HTTP เพื่อป้องกันการแคช เมื่อฉันคลิกปุ่ม "ย้อนกลับ" ในเบราว์เซอร์หน้าภายนอกจะทำงานได้อย่างถูกต้อง แต่ไม่ว่าจะเป็นอย่างไรเบราว์เซอร์จะดึงแคชของหน้า iframed เสมอ IE ทำงานได้ดี แต่ Firefox และ Safari ทำให้ฉันมีปัญหา

หน้าเว็บของฉันมีลักษณะดังนี้:

<html>
  <head><!-- stuff --></head>
<body>
  <!-- stuff -->
  <iframe src="webpage2.html?var=xxx" />
  <!-- stuff -->
</body>
</html>

varตัวแปรเสมอเปลี่ยนแปลง แม้ว่า URL ของ iframe จะมีการเปลี่ยนแปลง (ดังนั้นเบราว์เซอร์ควรส่งคำขอใหม่ไปยังหน้านั้น) แต่เบราว์เซอร์จะดึงเนื้อหาที่แคชไว้

ผมได้ตรวจสอบการร้องขอ HTTP และการตอบสนองจะกลับมาและผมสังเกตเห็นว่าแม้ว่าหน้าด้านนอกมีเบราว์เซอร์จะยังคงสามารถดึงข้อมูล<iframe src="webpage2.html?var=222" />webpage2.html?var=111

นี่คือสิ่งที่ฉันได้ลองทำแล้ว:

  • การเปลี่ยน URL iframe ด้วยค่า var แบบสุ่ม
  • การเพิ่มส่วนหัว Expires, Cache-Control และ Pragma ในหน้าเว็บภายนอก
  • การเพิ่มส่วนหัว Expires, Cache-Control และ Pragma ในหน้าเว็บด้านใน

ฉันไม่สามารถใช้เทคนิค JavaScript ใด ๆ ได้เนื่องจากฉันถูกบล็อกโดยนโยบายที่มาเดียวกัน

ฉันหมดความคิด ไม่มีใครรู้วิธีหยุดเบราว์เซอร์จากการแคชเนื้อหา iframed?

อัปเดต

ฉันติดตั้ง Fiddler2 ตามที่ Daniel แนะนำให้ทำการทดสอบอีกครั้งและน่าเสียดายที่ฉันยังคงได้ผลลัพธ์เหมือนเดิม

นี่คือการทดสอบที่ฉันทำ:

  1. หน้านอกสร้างหมายเลขสุ่มโดยใช้Math.random()ใน JSP
  2. หน้านอกจะแสดงหมายเลขสุ่มบนหน้าเว็บ
  3. หน้าเว็บภายนอกเรียก iframe โดยส่งผ่านหมายเลขสุ่ม
  4. หน้าด้านในจะแสดงหมายเลขสุ่ม

ด้วยการทดสอบนี้ฉันสามารถดูได้อย่างชัดเจนว่าหน้าใดกำลังอัปเดตและหน้าใดถูกแคช

ทดสอบภาพ

สำหรับการทดสอบอย่างรวดเร็วฉันโหลดหน้านี้ไปที่หน้าอื่นแล้วกด "ย้อนกลับ" นี่คือผลลัพธ์:

หน้าเดิม:

  • หน้านอก: 0.21300034290246206
  • หน้าภายใน: 0.21300034290246206

ออกจากหน้าแล้วกดย้อนกลับ:

  • หน้านอก: 0.4470929019483644
  • หน้าภายใน: 0.21300034290246206

นี่แสดงว่าเพจด้านในกำลังถูกแคชแม้ว่าเพจด้านนอกจะเรียกเพจด้วยพารามิเตอร์ GET ที่แตกต่างกันใน URL ด้วยเหตุผลบางประการเบราว์เซอร์จึงเพิกเฉยต่อข้อเท็จจริงที่ว่า iframe กำลังขอ URL ใหม่ มันก็โหลดอันเก่า

การทดสอบ Fiddler

แน่นอนว่า Fiddler ยืนยันในสิ่งเดียวกัน

(ฉันโหลดหน้านี้)

เรียกว่าเพจด้านนอก HTML:

0.21300034290246206
<iframe src="http://ipv4.fiddler:1416/page1.aspx?var=0.21300034290246206" />

http: //ipv4.fiddler: 1416 / page1.aspx? var = 0.21300034290246206เรียกว่า

(ฉันออกจากหน้าแล้วกดย้อนกลับ)

เรียกว่าเพจด้านนอก HTML:

0.4470929019483644
<iframe src="http://ipv4.fiddler:1416/page1.aspx?var=0.4470929019483644" />

http: //ipv4.fiddler: 1416 / page1.aspx? var = 0.21300034290246206เรียกว่า

จากการทดสอบนี้ดูเหมือนว่าเว็บเบราว์เซอร์จะไม่ได้แคชหน้าเว็บ แต่เป็นการแคช URL ของ iframe จากนั้นทำการร้องขอใหม่ใน URL ที่แคชนั้น อย่างไรก็ตามฉันยังคงนิ่งงันเกี่ยวกับวิธีแก้ปัญหานี้

ใครมีความคิดเกี่ยวกับวิธีหยุดเว็บเบราว์เซอร์จากการแคช URL ของ iframe บ้าง?


11
+1 - งานเขียนของคุณจับความเจ็บปวดได้ดีมาก
nickf

1
ขอบคุณสำหรับคำอธิบายโดยละเอียดเกี่ยวกับปัญหานี่คือสิ่งที่ฉันพบกับไซต์ 100% เป็นเวลาเจ็ดปีแล้วที่รายงานข้อบกพร่องของ firefoxยังคงมีอยู่
Scuzzy

คำตอบ:


-3

กำหนดให้ URL ของ iframe ชี้ไปที่หน้าบนไซต์ของคุณซึ่งทำหน้าที่เป็นพร็อกซีในการดึงและส่งคืนเนื้อหาจริงของ iframe ตอนนี้คุณไม่ถูกผูกมัดโดยนโยบายที่มาเดียวกันอีกต่อไป (แก้ไข: ไม่ได้ป้องกันปัญหาการแคช iframe)


41
สิ่งนี้ไม่ได้ป้องกันแคช
baash05

@ baash05 ฉันไม่เคยอ้างว่ามันทำ; ฉันบอกว่ามันหลีกเลี่ยงนโยบายที่มาเดียวกัน
kmoser

1
จริง .. แต่ชื่อเรื่อง op อ่านว่า "การป้องกันการแคช iframe ในเบราว์เซอร์" และหากคำตอบของคุณไม่ได้ป้องกันการแคช iframe ในเบราว์เซอร์ก็ไม่ใช่คำตอบจริงๆ เป็นเรื่องที่ควรทราบ แต่ยังไม่ใช่คำแนะนำที่ดีสำหรับผู้ที่ต้องการป้องกันการแคช
baash05

OP ต้องการแก้ปัญหาการแคชและหลีกเลี่ยงนโยบายที่มาเดียวกัน คำตอบบางส่วนดีกว่าไม่มี :)
kmoser

2
ขนมปังปิ้งมักจะคว่ำด้านข้างลง :)
baash05

59

นี่คือข้อบกพร่องใน Firefox:

https://bugzilla.mozilla.org/show_bug.cgi?id=356558

ลองใช้วิธีแก้ปัญหานี้:

<iframe src="webpage2.html?var=xxx" id="theframe"></iframe>

<script>
var _theframe = document.getElementById("theframe");
_theframe.contentWindow.location.href = _theframe.src;
</script>

3
วันนี้ 27.2.2014 ฉันมีความสุขมากที่ได้พบหัวข้อนี้ฉันคิดว่ามันสามารถแก้ไขได้ด้วยการไม่แคชฝั่งเซิร์ฟเวอร์ FF 27 ยังมีบั๊กนี้
Robert

7
7.8.2014-8 ปีต่อมาและยังไม่ได้รับการแก้ไข
Łukasz Zaroda

สิ่งนี้ใช้กับแอตทริบิวต์ srcdoc ด้วยแปลกมาก ... เยี่ยมมากที่ได้พบสิ่งนี้
elundmark

2
ฉันพบปัญหาการแคชเดียวกันกับ Chrome และ JavaScript สองบรรทัดก็แก้ไขได้ ขอขอบคุณ!
ธ อร์น

2
ว้าวมีปัญหาเดียวกันแน่นอน เฉพาะสำหรับ Firefox - ทำงานได้ดีใน IE, Chrome และอื่น ๆ ขอบคุณ @caleb ไม่อยากจะเชื่อเลยว่าสิ่งนี้คงอยู่มานาน
Voodoo

33

ฉันสามารถแก้ไขข้อบกพร่องนี้ได้โดยการตั้งค่าnameแอตทริบิวต์เฉพาะบน iframe - ไม่ว่าด้วยเหตุผลใดก็ตามสิ่งนี้ดูเหมือนจะทำให้แคชหมด คุณสามารถใช้ข้อมูลไดนามิกใด ๆ ที่คุณมีเป็นnameแอตทริบิวต์หรือเพียงแค่ ms หรือ ns ปัจจุบันในภาษาแม่แบบใดก็ได้ที่คุณใช้ นี่เป็นวิธีแก้ปัญหาที่ดีกว่าข้างต้นเนื่องจากไม่ต้องใช้ JS โดยตรง

ในกรณีเฉพาะของฉัน iframe ถูกสร้างผ่าน JS (แต่คุณสามารถทำได้เช่นเดียวกันผ่าน PHP, Ruby อะไรก็ได้) ดังนั้นฉันจึงใช้Date.now():

return '<iframe src="' + src + '" name="' + Date.now() + '" />';

สิ่งนี้แก้ไขข้อบกพร่องในการทดสอบของฉัน อาจเป็นเพราะwindow.nameในหน้าต่างด้านในเปลี่ยนไป


2
คำตอบนี้ใช้ได้กับ Chrome, Firefox และ Safari เมื่อปลายปี 2015
rovermicrover

13

ในขณะที่คุณกล่าวว่าปัญหาที่นี่ไม่ได้iframe แคชเนื้อหาแต่แคช iframe URL

ณ เดือนกันยายน 2018 ดูเหมือนว่าปัญหายังคงเกิดขึ้นใน Chrome แต่ไม่ใช่ใน Firefox

ฉันได้ลองทำหลายอย่างแล้ว (เพิ่มพารามิเตอร์ GET ที่เปลี่ยนไป, ล้าง iframe url ใน onbeforeunload, ตรวจจับ "โหลดซ้ำจากแคช" โดยใช้คุกกี้, ตั้งค่าส่วนหัวการตอบกลับต่างๆ) และนี่เป็นเพียงสองวิธีที่ได้ผลจากฉัน:

1- วิธีง่ายๆ: สร้าง iframe ของคุณแบบไดนามิกจากจาวาสคริปต์

ตัวอย่างเช่น:

const iframe = document.createElement('iframe')
iframe.id = ...
...
iframe.src = myIFrameUrl 
document.body.appendChild(iframe)

2- วิธีที่ซับซ้อน

ฝั่งเซิร์ฟเวอร์ตามที่อธิบายไว้ที่นี่ปิดใช้งานการแคชเนื้อหาสำหรับเนื้อหาที่คุณให้บริการสำหรับ iframe หรือสำหรับเพจหลัก (จะทำ)

และ

ตั้งค่า iframe url จาก javascript ด้วยพารามิเตอร์การค้นหาที่เปลี่ยนแปลงเพิ่มเติมดังนี้:

const url = myIFrameUrl + '?timestamp=' + new Date().getTime()
document.getElementById('my-iframe-id').src = url

(เวอร์ชันที่เรียบง่ายโปรดระวังพารามิเตอร์การค้นหาอื่น ๆ )


5

หลังจากลองทำทุกอย่างแล้ว (ยกเว้นการใช้พร็อกซีสำหรับเนื้อหา iframe) ฉันพบวิธีป้องกันการแคชเนื้อหา iframe จากโดเมนเดียวกัน :

ใช้.htaccessและเขียนกฎใหม่และเปลี่ยนsrcแอตทริบิวต์iframe

RewriteRule test/([0-9]+)/([a-zA-Z0-9]+).html$ /test/index.php?idEntity=$1&token=$2 [QSA]

วิธีที่ฉันใช้ก็คือ URL ของ iframe จะลงเอยด้วยวิธีนี้: example.com/test/54/e3116491e90e05700880bf8b269a8cc7.html

โดยที่ [โทเค็น] คือค่าที่สร้างขึ้นแบบสุ่ม URL นี้ป้องกันการแคช iframe เนื่องจากโทเค็นไม่เหมือนกันและ iframe คิดว่าเป็นหน้าเว็บที่แตกต่างกันโดยสิ้นเชิงเนื่องจากการรีเฟรชครั้งเดียวโหลด URL ที่แตกต่างกันโดยสิ้นเชิง:

example.com/test/54/e3116491e90e05700880bf8b269a8cc7.html
example.com/test/54/d2cc21be7cdcb5a1f989272706de1913.html

ทั้งสองนำไปสู่หน้าเดียวกัน

คุณสามารถเข้าถึงพารามิเตอร์ url ที่ซ่อนอยู่ด้วย $_SERVER["QUERY_STRING"]


1
ทำงานให้ฉัน - ขอบคุณ!
Quinn Finney

@QuinnFinney ดีใจที่สิ่งนี้มีประโยชน์กับคนอื่น ปัญหานี้ฉันใช้เวลาสองสามวันในการแก้ไข :)
Jeff Noel

ใช่ฉันด้วย! hahaha
Quinn Finney


3

หากต้องการให้ iframe โหลดเนื้อหาใหม่เสมอให้เพิ่มการประทับเวลา Unix ปัจจุบันที่ส่วนท้ายของพารามิเตอร์ GET จากนั้นเบราว์เซอร์จะเห็นว่าเป็นคำขอ 'อื่น' และจะค้นหาเนื้อหาใหม่

ใน Javascript อาจมีลักษณะดังนี้:

frames['my_iframe'].location.href='load_iframe_content.php?group_ID=' + group_ID + '&timestamp=' + timestamp;

3

ฉันพบปัญหานี้ใน Chrome ล่าสุดรวมถึง Safari ล่าสุดบน Mac OS X ณ วันที่ 17 มีนาคม 2016 การแก้ไขข้างต้นไม่ได้ผลสำหรับฉันรวมถึงการกำหนด src ให้ว่างเปล่าแล้วกลับไปที่บางไซต์ พารามิเตอร์ "name" ที่ตั้งชื่อแบบสุ่มหรือเพิ่มตัวเลขสุ่มที่ท้าย URL หลังแฮชหรือกำหนดหน้าต่างเนื้อหา href ให้กับ src หลังจากกำหนด src

ในกรณีของฉันเป็นเพราะฉันใช้ Javascript เพื่ออัปเดต IFRAME และเปลี่ยนเฉพาะแฮชใน URL

วิธีแก้ปัญหาในกรณีของฉันคือฉันสร้าง URL ระหว่างกาลที่มีการเปลี่ยนเส้นทางเมตา 0 วินาทีไปยังหน้าอื่นนั้น มันเกิดขึ้นเร็วมากจนฉันแทบไม่สังเกตเห็นแฟลชบนหน้าจอ นอกจากนี้ฉันยังทำให้สีพื้นหลังของหน้าชั่วคราวเหมือนกับหน้าอื่น ๆ ดังนั้นคุณจึงสังเกตเห็นได้น้อยลง


2

ฉันตั้งค่าแอตทริบิวต์ iframe src ในแอปของฉันในภายหลัง ในการกำจัดเนื้อหาที่แคชไว้ใน iframe เมื่อเริ่มต้นแอปพลิเคชันฉันเพียงแค่ทำ:

myIframe.src = "";

... อยู่ที่จุดเริ่มต้นของโค้ด js (เช่นใน jquery $ () handler)

ขอบคุณข้อมูล http://www.freshsupercool.com/2008/07/10/firefox-caching-iframe-data/


0

ฉันมีปัญหานี้ในปี 2559 ด้วย iOS Safari สิ่งที่ดูเหมือนจะได้ผลสำหรับฉันคือการให้พารามิเตอร์ GET กับ iframe src และค่าสำหรับมันเช่นนี้

<iframe width="60%" src="../other/url?cachebust=1" allowfullscreen></iframe>


-1

คุณได้ติดตั้งFiddler2 แล้วหรือยัง?

มันจะช่วยให้คุณเห็นสิ่งที่ถูกร้องขอสิ่งที่ถูกส่งกลับ ฯลฯ ฟังดูไม่น่าจะเป็นไปได้ที่เบราว์เซอร์จะกดแคชสำหรับ URL ที่แตกต่างกัน


1
ขอบคุณสำหรับเคล็ดลับเกี่ยวกับ Fiddler2 ตอนนี้ฉันรู้แล้วว่าเบราว์เซอร์ไม่ได้แคชเนื้อหา iframe มันเป็นเพียงการแคช URL iframe อย่างไรก็ตามฉันยังคงนิ่งงันและฉันไม่รู้ว่าทำไมเบราว์เซอร์ถึงเพิกเฉยต่อ URL iframe ของหน้าใหม่และเพียงแค่ใช้ URL เก่า
JR.

-1

หากคุณต้องการที่จะคลั่งไคล้จริงๆคุณสามารถใช้ชื่อเพจเป็น URL แบบไดนามิกที่แก้ไขเป็นหน้าเดียวกันเสมอแทนที่จะเป็นตัวเลือกสตริงการสืบค้น?

สมมติว่าคุณอยู่ในสำนักงานให้ตรวจสอบว่ามีการแคชเกิดขึ้นที่ระดับเครือข่ายหรือไม่ เชื่อฉันมันเป็นไปได้ พนักงานไอทีของคุณจะสามารถบอกคุณได้ว่ามีโครงสร้างพื้นฐานเครือข่ายใด ๆ ที่อยู่รอบ ๆ การแคช HTTP แม้ว่าจะเกิดขึ้นกับ iframe เท่านั้นจึงไม่น่าเป็นไปได้


-2

คุณได้ลองเพิ่มตัวเลือก HTTP Header ต่างๆสำหรับการไม่มีแคชในหน้า iframe หรือไม่?


ได้. ฉันได้ลองใช้คำสั่งไม่มีแคชทั้งในส่วนหัว HTTP และเมตาแท็กในแต่ละหน้า
JR.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.