วิธีรับ URL ก่อนหน้าใน JavaScript


230

มีวิธีการรับ URL ก่อนหน้าใน JavaScript หรือไม่ บางสิ่งเช่นนี้

alert("previous url is: " + window.history.previous.href);

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

คำตอบ:


351
document.referrer

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

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

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


4
นอกจากนี้ยังมี document.referrer ถ้าคุณมาที่หน้าปัจจุบันผ่านลิงค์ (เช่นไม่ใช่คั่นหน้าหรือพิมพ์ในแถบที่อยู่)
Hellion

68
ฉันสิ้นสุดการจัดเก็บ URL ก่อนหน้านี้ในคุกกี้สำหรับเว็บไซต์document.referrerไม่ได้ผลเสมอไป $.cookie("previousUrl", window.location.href, {path:"/"});.
แลนซ์พอลลาร์ด

4
คุณช่วยฉันจากความเจ็บปวดจาวาสคริปต์!
Anna Lam

8
ก่อนหน้านี้ไม่ได้อ้างอิง อย่าสับสนพวกเขา
Green

1
document.referrer ไม่ได้บันทึก hash จาก url ล่าสุด ... มันอ้างถึง url ล่าสุดเท่านั้น
Nmaster88

29

หากคุณต้องการไปที่หน้าก่อนหน้าโดยไม่ทราบ URL คุณสามารถใช้ api ประวัติใหม่

history.back(); //Go to the previous page
history.forward(); //Go to the next page in the stack
history.go(index); //Where index could be 1, -1, 56, etc.

แต่คุณไม่สามารถจัดการเนื้อหาของสแต็คประวัติบนเบราว์เซอร์ที่ไม่รองรับ API ประวัติ HTML5

สำหรับข้อมูลเพิ่มเติมโปรดดูเอกสาร


2
จะทำอย่างไรกับการรู้ URL, href = ''
summu

@summu มันถูกเก็บไว้ในเบราว์เซอร์เอง
Ahmed Taha

20

document.referrer ไม่เหมือนกับ URL จริงในทุกสถานการณ์

ฉันมีแอปพลิเคชั่นที่ฉันต้องสร้างเฟรมด้วย 2 เฟรม มีการรู้จักเฟรมหนึ่งเฟรมหนึ่งคือเพจที่ฉันกำลังเชื่อมโยงจาก ดูเหมือนว่าdocument.referrerจะเหมาะที่สุดเพราะคุณไม่ต้องส่งชื่อไฟล์จริงไปยังเอกสาร frameset

อย่างไรก็ตามหากคุณเปลี่ยนหน้าเฟรมด้านล่างในภายหลังจากนั้นใช้history.back()มันจะไม่โหลดหน้าต้นฉบับลงในเฟรมด้านล่าง แต่จะโหลดซ้ำdocument.referrerและทำให้เฟรมเซตหายไปและคุณกลับไปที่หน้าต่างเริ่มต้นเดิม

ใช้เวลาสักครู่เพื่อทำความเข้าใจกับสิ่งนี้ ดังนั้นในอาร์เรย์ประวัติdocument.referrerไม่ได้เป็นเพียง URL แต่เป็นข้อกำหนดของหน้าต่างผู้อ้างอิงเช่นกัน อย่างน้อยนั่นเป็นวิธีที่ดีที่สุดที่ฉันสามารถเข้าใจได้ในเวลานี้


จากการทดสอบล่าสุดของฉัน 'document.referrer' ตอนนี้แค่คืนชื่อโดเมนและไม่ใช่ URL แบบเต็มเพื่อหลีกเลี่ยงการติดตาม
Akash Kumar Seth

12

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

window.history.pushState({ prevUrl: window.location.href }, null, "/new/path/in/your/app")

จากนั้นในเส้นทางใหม่ของคุณคุณสามารถทำสิ่งต่อไปนี้เพื่อดึง URL ก่อนหน้า:

window.history.state.prevUrl // your previous url

0

ผู้ที่คุณใช้ Node.js และ Express สามารถตั้งค่าคุกกี้เซสชันที่จะจดจำ URL ของหน้าปัจจุบันดังนั้นช่วยให้คุณสามารถตรวจสอบผู้อ้างอิงในการโหลดหน้าถัดไป นี่คือตัวอย่างที่ใช้express-sessionมิดเดิลแวร์:

//Add me after the express-session middleware    
app.use((req, res, next) => {
    req.session.referrer = req.protocol + '://' + req.get('host') + req.originalUrl;
    next();
});

จากนั้นคุณสามารถตรวจสอบการมีอยู่ของคุกกี้ผู้อ้างอิงดังนี้:

if ( req.session.referrer ) console.log(req.session.referrer);

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


0
<script type="text/javascript">
    document.write(document.referrer);
</script>

document.referrer ให้บริการตามวัตถุประสงค์ของคุณ แต่ไม่สามารถใช้งานได้กับ Internet Explorer เวอร์ชันก่อนหน้า IE9

มันจะทำงานกับเบราว์เซอร์ยอดนิยมอื่น ๆ เช่น Chrome, Mozilla, Opera, Safari เป็นต้น


ทำงานได้ใน IE 9 สำหรับฉัน
frodo2975

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