วิธีรับ Url Hash (#) จากฝั่งเซิร์ฟเวอร์


135

ฉันรู้ว่าในฝั่งไคลเอนต์ (javascript) คุณสามารถใช้ windows.location.hash ได้ แต่ไม่พบการเข้าถึงจากฝั่งเซิร์ฟเวอร์


คุณได้รับวิธีแก้ปัญหานี้หรือไม่ฉันมีบุ๊กมาร์กที่มี URL และต้องการเข้าถึงข้อความหลังจากแฮชทางฝั่งเซิร์ฟเวอร์
dotnetcoder

คำตอบอธิบายว่าสิ่งนี้ไม่มีประโยชน์บนเซิร์ฟเวอร์เนื่องจากถูกตีความโดยตัวแทนผู้ใช้เท่านั้น ฉันพยายามเปลี่ยนแท็บที่ใช้งานอยู่ซึ่งฉันกำลังพยายามทำเช่นนั้นที่ฝั่งเซิร์ฟเวอร์ ฉันลงเอยด้วยการทำในฝั่งไคลเอ็นต์แทน
Ricky Supit

คำตอบ:


134

เรามีสถานการณ์ที่เราจำเป็นต้องคงแฮช URL ไว้ใน ASP.Net หลังการโพสต์ เนื่องจากเบราว์เซอร์ไม่ส่งแฮชไปยังเซิร์ฟเวอร์โดยค่าเริ่มต้นวิธีเดียวที่จะทำได้คือใช้ Javascript บางตัว:

  1. เมื่อส่งแบบฟอร์มแล้วให้จับแฮช ( window.location.hash) และเก็บไว้ในฟิลด์อินพุตที่ซ่อนอยู่ฝั่งเซิร์ฟเวอร์ใส่สิ่งนี้ใน DIV โดยมี id เป็น " urlhash" เพื่อให้เราสามารถค้นหาได้ง่ายในภายหลัง

  2. บนเซิร์ฟเวอร์คุณสามารถใช้ค่านี้ได้หากคุณต้องการทำอะไรบางอย่างกับมัน คุณยังสามารถเปลี่ยนได้หากต้องการ

  3. ในการโหลดหน้าบนไคลเอนต์ให้ตรวจสอบค่าของฟิลด์ที่ซ่อนอยู่นี้ คุณจะต้องค้นหาโดย DIV ที่มีอยู่เนื่องจากจะไม่ทราบรหัสที่สร้างขึ้นโดยอัตโนมัติ ใช่คุณสามารถใช้กลอุบายบางอย่างได้ที่นี่ด้วย. ClientID แต่เราพบว่ามันง่ายกว่าแค่ใช้ wrapper DIV เนื่องจากอนุญาตให้ Javascript ทั้งหมดนี้อยู่ในไฟล์ภายนอกและใช้ในรูปแบบทั่วไป

  4. หากช่องป้อนข้อมูลที่ซ่อนอยู่มีค่าที่ถูกต้องให้ตั้งค่านั้นเป็นแฮช URL ( window.location.hash again) และ / หรือดำเนินการอื่น ๆ

เราใช้ jQuery เพื่อลดความซับซ้อนในการเลือกฟิลด์ ฯลฯ ... สรุปแล้วเป็นการเรียก jQuery สองสามครั้งหนึ่งเพื่อบันทึกค่าและอีกอันเพื่อเรียกคืน

ก่อนส่ง:

$("form").submit(function() {
  $("input", "#urlhash").val(window.location.hash);
});

ในการโหลดหน้า:

var hashVal = $("input", "#urlhash").val();
if (IsHashValid(hashVal)) {
  window.location.hash = hashVal;
}

IsHashValid()สามารถตรวจสอบ " undefined" หรือสิ่งอื่น ๆ ที่คุณไม่ต้องการจัดการ

ตรวจสอบให้แน่ใจว่าคุณใช้$(document).ready()อย่างเหมาะสมแน่นอน


4
ทางออกที่ดี แต่คำขอ GET คืออะไร?
Warlock

2
@Chris - แต่เหตุการณ์การส่งแบบฟอร์มจะถูกเรียกอย่างไรเมื่อคุณเพียงแค่วาง URL ในเบราว์เซอร์อื่น (เนื่องจากเป็นเพียงคำขอ GET)
KrishPrabakar

@Warlock ไม่ว่าการรับ / โพสต์จะใช้งานได้เนื่องจากคุณเก็บแฮชไว้ในช่องที่ซ่อนอยู่
KMX

84

RFC 2396ส่วน 4.1:

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

(เน้นเพิ่ม)


3
ฉันประหลาดใจ. ฉันอ่านเกี่ยวกับสปามามากและไม่รู้เรื่องนั้น ดังนั้นเบราว์เซอร์จึงส่งข้อมูลที่ละเอียดอ่อนมาก แต่ไม่แฮช ?? ฉันคิดว่ามันน่าจะไปในอนาคต .. อย่างน้อยก็เป็นส่วนหัว HTTP แยกต่างหาก เรื่องนี้เกี่ยวข้อง: onebigfluke.com/2015/01/…
bodrin

42

นั่นเป็นเพราะเบราว์เซอร์ไม่ส่งส่วนนั้นไปยังเซิร์ฟเวอร์ขออภัย


7

อาจเป็นทางเลือกเดียวคืออ่านในฝั่งไคลเอ็นต์และโอนไปยังเซิร์ฟเวอร์ด้วยตนเอง (GET / POST / AJAX) ขอแสดงความนับถือ Artur

คุณอาจเห็นวิธีการเล่นด้วยปุ่มย้อนกลับและประวัติเบราว์เซอร์ ที่ Malcan


3

เพียงเพื่อแยกแยะความเป็นไปได้ที่คุณไม่ได้พยายามดูแฟรกเมนต์บน GET / POST และต้องการทราบวิธีเข้าถึงส่วนนั้นของอ็อบเจ็กต์ URI ที่คุณมีภายในโค้ดฝั่งเซิร์ฟเวอร์ซึ่งอยู่ภายใต้ Uri ( เอกสาร MSDN )


8
IE8, Chrome และ Firefox ทั้งหมดจะไม่ส่งแฮชไปยังเซิร์ฟเวอร์ ดังนั้น Uri.Fragment จึงเป็นสตริงว่างเสมอหากคุณตรวจสอบ Request.Url.Fragment ฝั่งเซิร์ฟเวอร์ (ตามคำตอบด้านบน)
zcrar70

0

วิธีแก้ปัญหาที่เป็นไปได้สำหรับคำขอ GET:

รูปแบบลิงค์ใหม่: http://example.com/yourDirectory?hash=video01

เรียกใช้ฟังก์ชันนี้ที่ด้านบนของตัวควบคุมหรือhttp://example.com/yourDirectory/index.php:

function redirect()
{
    if (!empty($_GET['hash'])) {
        /** Sanitize & Validate $_GET['hash']
               If valid return string
               If invalid: return empty or false
        ******************************************************/
        $validHash = sanitizeAndValidateHashFunction($_GET['hash']);
        if (!empty($validHash)) {
            $url = './#' . $validHash;
        } else {
            $url = '/your404page.php';
        }
        header("Location: $url");
    }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.