2010-11-08 16 views
6

मैं एक क्वेरी स्ट्रिंग से बाहर चर खींचने के लिए निम्नलिखित जावास्क्रिप्ट वर्ग का उपयोग करें:जावास्क्रिप्ट मेरी mod_rewrite क्वेरी स्ट्रिंग नहीं ढूंढ सकता है!

getUrlVars : function() { 
    var vars = {}; 
    var parts = window.location.href.replace(/[?&]+([^=&]+)=([^&]*)/gi, function(m,key,value) { 
     vars[key] = value; 
    }); 
    return vars; 
} 

तो इस काम करता है: http://example.com/signinup.html?opt=login

मैं http://www.example.com/login/ जरूरत है उसी तरह काम करने के लिए। का उपयोग mod_rewrite:

RewriteRule ^login/? signinup.html?opt=login [QSA]

पेज लोड करने के लिए अनुमति देता है, लोड जावास्क्रिप्ट को, लोड करने के लिए सीएसएस, लेकिन मेरे जावास्क्रिप्ट कार्यों opt कुंजी नहीं मिल सकता है (यानी, वह undefined है)। मैं अपने जावास्क्रिप्ट में opt कैसे प्राप्त करूं?

उत्तर

3

जावास्क्रिप्ट क्लाइंट-साइड है। Mod_rewrite सर्वर-साइड है।

इसलिए जावास्क्रिप्ट को फिर से लिखे गए यूआरएल को कभी नहीं देखा जाएगा। जहां तक ​​आपका ब्राउज़र चिंतित है, आपके द्वारा दर्ज यूआरएल पूरा पता है।

एकमात्र वास्तविक समाधान आपके जावास्क्रिप्ट को बदलना है, इसलिए यह पुराना संस्करण (या संभवतः दोनों विकल्पों के लिए पार्स जैसा यूआरएल है, क्योंकि पुराना यूआरएल अभी भी काम करेगा और लोगों के पास पुराने बुकमार्क भी हो सकते हैं)।

अन्य संभावित समाधान आपके सर्वर-साइड कोड (PHP? जो कुछ भी हो) पर जाना होगा जहां आप पुनः लिखित यूआरएल देख सकते हैं, और कुछ जावास्क्रिप्ट कोड डालें जहां आप क्लाइंट साइड पर पार्स कर सकते हैं। हालांकि एक आदर्श समाधान नहीं है। आप विकल्प 1 के साथ जाकर बेहतर होंगे और आपको उन URL से निपटने के लिए जावास्क्रिप्ट बदलना होगा जो वास्तव में होने जा रहे हैं।

+0

धन्यवाद सब! @ स्पडली का जवाब सबसे स्पष्ट जवाब है, लेकिन हर किसी ने मुझे बहुत अच्छे जवाब दिए। क्लाइंट/सर्वर जो समझ में आता है (ओउप्स)। इसके अलावा, दूसरों को @ क्रिस के [आर] ध्वज उत्तर में रुचि हो सकती है। – Kyle

2

आपकी समस्या यह है कि जावास्क्रिप्ट क्लाइंट पक्ष पर चलता है, इसलिए यह कभी भी ?opt=login भाग नहीं देख पाएगा जिस पर यूआरएल सर्वर पर आंतरिक रूप से परिवर्तित हो जाता है।

नए यूआरएल प्रारूप से मेल खाने के लिए अपनी नियमित अभिव्यक्ति को बदलने के अलावा, सबसे आसान कामकाज सर्वर पक्ष पर एक जावास्क्रिप्ट स्टेटमेंट लिखना हो सकता है जो opt वैरिएबल में वैरिएबल में मूल्य प्रस्तुत करता है।

1

यदि यह एक विशेष मामला है, तो इसे किसी विशेष तरीके से एक विशेष मामले के रूप में रखें। यदि आप आम तौर पर फिर से लिखते हैं, तो अपनी सामान्य नियमित अभिव्यक्ति बदलें। जिस तरह mod_rewrite काम करता है, क्लाइंट फिर से लिखे गए यूआरएल को कभी नहीं जानता है। ग्राहक से, यह केवल /login/ और /login/ है। केवल सर्वर ही जानता है कि यह वास्तव में signinup.html?opt=login है। तो आपकी नियमित अभिव्यक्ति या स्थान का कोई तरीका नहीं है। इसके बारे में पता चल सकता है।

1

जब तक आप अपने RewriteRule में [R] ध्वज का उपयोग नहीं करते हैं, तो ब्राउज़र (और इस प्रकार जावास्क्रिप्ट) को नए URL के बारे में कभी नहीं पता होगा। यदि आप लोगों को रीडायरेक्ट नहीं करना चाहते हैं, तो आपको अपने लॉगिन पेज पर कुछ कोड जोड़ना होगा जो पृष्ठ में जावास्क्रिप्ट के रूप में पैरामीटर प्राप्त करें।

1

यदि आप PHP का उपयोग कर रहे हैं, तो आप PHP के लिए एक जावास्क्रिप्ट चर बना सकते हैं। उदाहरण के लिए:

$params = "?"; 

foreach($_GET as $key => $value) { 
    $params = $params . $key . "=" . $value . "&"; 
} 

echo 'var urlParams = "' . $params . '"'; 

अब, आप जावास्क्रिप्ट एक urlParams चर है कि इस

?opt=login& 

तरह लग रहा है फिर, अपने जावास्क्रिप्ट कोड में के लिए उपयोग होगा, जहाँ भी आप URL पैरामीटर का उपयोग करने की उम्मीद है, का उपयोग करें इसके बजाय urlParams

संबंधित मुद्दे