सर्वर से ओरल हैश (#) कैसे प्राप्त करें


133

मैं क्लाइंट साइड (जावास्क्रिप्ट) पर जानता हूं आप windows.location.hash का उपयोग कर सकते हैं, लेकिन सर्वर साइड से एक्सेस करने के लिए वैसे भी नहीं मिल सका।


क्या आपको इस समस्या से निपटने का एक तरीका मिला है, मेरे पास url में बुकमार्क हैं और सर्वर साइड पर हैश के बाद टेक्स्ट को एक्सेस करना चाहते हैं?
डॉटनेटकोडर

उत्तर बताते हैं कि यह सर्वर पर उपलब्ध नहीं है, क्योंकि केवल उपयोगकर्ता एजेंट द्वारा व्याख्या की जाती है। मैं सक्रिय टैब को बदलने की कोशिश कर रहा था, जिसे मैं सर्वर साइड पर करने की कोशिश कर रहा था। मैंने इसे क्लाइंट साइड पर करने के बजाय समाप्त कर दिया।
रिक्की सुपिट

जवाबों:


134

हमारे पास ऐसी स्थिति थी जहां हमें ASP.Net पोस्ट बैक में URL हैश को बनाए रखने की आवश्यकता थी। चूंकि ब्राउज़र डिफ़ॉल्ट रूप से सर्वर को हैश नहीं भेजता है, ऐसा करने का एकमात्र तरीका कुछ जावास्क्रिप्ट का उपयोग करना है:

  1. जब फ़ॉर्म सबमिट हो जाता है, तो हैश को पकड़ो ( window.location.hash) और इसे सर्वर-साइड छिपे हुए इनपुट फ़ील्ड में संग्रहीत करें "DIV में" urlhash" की एक आईडी के साथ रखें " ताकि हम इसे बाद में आसानी से पा सकें।

  2. सर्वर पर आप इस मान का उपयोग कर सकते हैं यदि आपको इसके साथ कुछ करने की आवश्यकता है। जरूरत पड़ने पर आप इसे बदल भी सकते हैं।

  3. क्लाइंट पर पृष्ठ लोड होने पर , इस छिपे हुए फ़ील्ड के मूल्य की जांच करें। आप इसे उस DIV द्वारा खोजना चाहेंगे जो इसमें निहित है क्योंकि स्वतः-जनरेट की गई आईडी ज्ञात नहीं होगी। हां, आप यहां कुछ चालबाजी कर सकते हैं।

  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 अनुरोध के बारे में क्या है?
करामाती

2
@ क्रिस - लेकिन जब आप बस एक अलग ब्राउज़र में URL चिपकाते हैं तो फॉर्म-सबमिट ईवेंट कैसे कहलाता है (क्योंकि यह केवल GET अनुरोध है)?
कृष्णप्रभाकर १५'१३ को

अगर आप किसी छिपे हुए क्षेत्र में हैश का भंडारण कर रहे हैं, तो इसे प्राप्त करने / पोस्ट करने की परवाह किए बिना, @Warlock।
केएमएक्स

83

RFC 2396 खंड 4.1:

जब एक यूआरआई संदर्भ का उपयोग पहचान किए गए संसाधन पर पुनर्प्राप्ति कार्रवाई करने के लिए किया जाता है, तो एक क्रॉसहैच ("#") चरित्र द्वारा यूआरआई से अलग किए गए वैकल्पिक खंड पहचानकर्ता में पुनर्प्राप्ति के बाद उपयोगकर्ता एजेंट द्वारा व्याख्या किए जाने वाले अतिरिक्त संदर्भ जानकारी शामिल होती है। कार्रवाई सफलतापूर्वक पूरी कर ली गई है । जैसे, यह एक यूआरआई का हिस्सा नहीं है, लेकिन अक्सर एक यूआरआई के साथ संयोजन में उपयोग किया जाता है।

(महत्व दिया)


3
मैं आश्चर्यचकित हूँ। मैंने एसपीए के बारे में बहुत कुछ पढ़ा है और यह ज्ञात नहीं है। तो ब्राउज़र इतनी संवेदनशील जानकारी भेजता है लेकिन हैश नहीं ?? मुझे लगता है कि इसे भविष्य में होना चाहिए .. कम से कम एक अलग HTTP हेडर के रूप में। यह संबंधित है: onebigfluke.com/2015/01/…
bodrin

42

ऐसा इसलिए है क्योंकि ब्राउज़र उस हिस्से को सर्वर तक नहीं पहुंचाता है, क्षमा करें।


7

संभवतः एकमात्र विकल्प क्लाइंट पक्ष पर इसे पढ़ना है और इसे मैन्युअल रूप से सर्वर (GET / POST / AJAX) में स्थानांतरित करना है। सादर अरत

आप यह भी देख सकते हैं कि मालकान में बैक बटन और ब्राउज़र इतिहास के साथ कैसे खेलें


3

बस उस संभावना से इंकार करने के लिए जिसे आप वास्तव में एक GET / POST पर टुकड़े को देखने की कोशिश नहीं कर रहे हैं और वास्तव में जानना चाहते हैं कि आपके सर्वर-साइड कोड में URI ऑब्जेक्ट के उस हिस्से तक कैसे पहुंचें, यह Uri.Fragment के तहत है। ( MSDN डॉक्स )।


8
IE8, क्रोम और फ़ायरफ़ॉक्स सभी सर्वर पर हैश नहीं भेजेंगे; हां, तो 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");
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.