2011-12-21 14 views
10

के लिए प्लस साइन इन क्वेरी स्ट्रिंग में कुछ साल पहले मैंने डेटाबेस संचालित एएसपी.NET साइट बनाई, जो सभी साइट पृष्ठों को प्रदर्शित करने के लिए एक एकल एपीएसएक्स पेज का उपयोग करता है। तो सभी साइट के URL निम्न स्वरूप में हैं:एएसपी.NET साइट

/main.aspx?page=Page+Title+One 

/main.aspx?page=Another+Article+Title 

/main.aspx?page=Third+Page 

main.aspx पेज क्वेरी स्ट्रिंग डेटा (पृष्ठ + शीर्षक + उदाहरण के लिए एक) हो जाता है और उचित लेख खींचने के लिए एक प्रमुख के रूप में यह का उपयोग करता है एसक्यूएल सर्वर डेटाबेस से सामग्री। पृष्ठ का वास्तविक शीर्षक डीबी में प्लस के बजाय रिक्त स्थान के साथ संग्रहीत किया जाता है (उदाहरण के लिए "पृष्ठ शीर्षक वन")।

यूआरएल क्वेरी स्ट्रिंग में एक शब्द विभाजक के रूप में + चिह्न के साथ जाने का खराब निर्णय हाल ही में खोज इंजन के साथ कई मुद्दों का कारण बन रहा है (डुप्लिकेट सामग्री, आदि), इसलिए मैं इसे ठीक करना चाहता हूं, लेकिन यूआरएल को बदलने के बिना ।

/main.aspx?page=Page Title One 

मैं 301 स्थाई रीडायरेक्ट करने के लिए क्या करना चाहते हैं:

मुझे क्या करना चाहते हैं जब खोज इंजन या आगंतुक उदाहरण के लिए याद आ रही + चिन्ह और बजाय सफेद रिक्त स्थान होने गलत URL पर जाने की कोशिश करता है:

/main.aspx?page=Page+Title+One 

वास्तविक quesry स्ट्रिंग है, भले ही यह मैं यदि क्वेरी स्ट्रिंग मान प्लस या सफेद रिक्त स्थान है जांच करने की आवश्यकता है, लेकिन जब मैं Request.QueryString [ "पृष्ठ"] के साथ मूल्य प्राप्त करने के लिए सक्षम होना करने के लिए इसमें प्लस मुझे अभी भी सफेद रिक्त स्थान "पृष्ठ शीर्षक वन" के साथ स्ट्रिंग मिलती है।

साइट IIS6/जीत पर चलता है 2003

मैं यह कैसे कर सकते हैं?

उत्तर

2

ठीक है, निश्चित रूप से आप किसी भी मामले में यूआरआई में जगह नहीं डाल सकते हैं। आप क्या कर सकते जिसमें %20 डाल दिया है यूआरआई में किसी भी बिंदु पर एक अंतरिक्ष क्वेरी हिस्से में एक अंतरिक्ष एन्कोड करने के लिए सामान्य तरीके से एन्कोड करने के लिए के रूप में अच्छी + के रूप में किया जा रहा है जिस तरह से, और के उस भाग में ऐसा करने की सिफारिश की रास्ता है क्योंकि% 20 समस्याएं पैदा कर सकता है।

इस वजह से

एक implementaiton विस्तार आवेदन/x-www फार्म-urlencoded Request.QueryString[] एक अंतरिक्ष में दोनों + और %20 मोड़, आप के लिए न छोड़ने करता है और हम सामान्य रूप से भेजा वास्तविक डेटा के बारे में परवाह,।

आप Request.RawUrl (एक स्ट्रिंग लौटाते हैं) या Request.Url पर देखना चाहते हैं जो Uri देता है। शायद Request.Url को UriBuilder में फ़ीड करना सबसे आसान है ताकि आप केवल क्वेरी को बदल सकें और Uri वापस प्राप्त कर सकें।

फिर भी, यदि आप क्वेरी स्ट्रिंग में किसी स्थान को एन्कोड करने के दो संभावित तरीकों के कारण डुप्लिकेट सामग्री के साथ समस्याएं हैं, तो मैं विपरीत दृष्टिकोण की अनुशंसा करता हूं, अनुशंसित मानदंड के साथ जाएं और %20 के मामलों को चालू करें + आसपास के रास्ते के बजाए।

var u = Request.Url; 
if(u.Query.Contains("%20")) 
{ 
    var ub = new UriBuilder(u); 
    Console.WriteLine(ub.Query); 
    string query = ub.Query; 
    //note bug in Query property - it includes ? in get and expects it not to be there on set 
    ub.Query = ub.Query.Replace("%20", "+").Substring(1); 
    Response.StatusCode = 301; 
    Response.RedirectLocation = ub.Uri.AbsoluteUri; 
    Response.End(); 
} 
+0

मेरे यूआरएल ने हमेशा सफेद रिक्त स्थान या% 20 के बजाय प्लस साइन का उपयोग किया है, हालांकि मुझे इन 2: /main.aspx?page=KW1 KW2 और /main.aspx?page=KW1% की तरह Google में कैश किए गए पृष्ठ दिखाई देते हैं। 20KW2, जो दोनों गलत हैं और डुप्लिकेट सामग्री के मुद्दों का कारण बन रहे हैं। अब मैं उन्हें उचित URL पर 301 करना चाहता हूं जो/main.aspx?page=KW1+KW2 है। –

+0

यह काफी कुछ है जो मैं समझा रहा था। सुनिश्चित नहीं है कि क्या स्पष्ट नहीं था, इसलिए कोड-उदाहरण जोड़ा गया है जो उम्मीद करता है। –

+0

धन्यवाद जॉन, यह वही है जो मुझे चाहिए :)। प्रश्न के उत्तर के रूप में मैं कैसे चिह्नित करूं? –

3

+ साइन इन यूआरएल के लिए एक जगह के रूप में व्याख्या किया जाता है।

यह है कि, किसी स्थान को एन्कोड करने के लिए, आप %20 या + का उपयोग कर सकते हैं।

this SO answer पर "स्पेस कैरेक्टर एन्कोडिंग URL: + या% 20?"

4

Request["key"] का उपयोग करना, यह स्वचालित रूप से सभी "+" संकेत स्थान में बदल देता है। यह देखने के लिए कि क्या प्लस संकेत हैं, आपको Request.RawUrl का उपयोग करने की आवश्यकता है।

इसके अतिरिक्त, आप किसी भी स्ट्रिंग क्वेरी को पार्स करने के लिए System.Web.HttpUtility.ParseQueryString का उपयोग कर सकते हैं। आप केवल परीक्षण कर सकते हैं अगर Request.QueryString.ToString().Contains("+") सत्य है, और वहां से तर्क करते हैं।

+0

यही मेरी समस्या है। मैं निम्नलिखित 2 जीईटी अनुरोधों के बीच भेद करने में सक्षम होना चाहता हूं: /main.aspx?page=KW1+KW2 और /main.aspx?page=KW1 KW2। –

+0

मेरी मूल पोस्ट देखें। ऐसा लगता है कि 'Request.QueryString.ToString()। इसमें शामिल है ("+")' अगर आपको पहला या दूसरा मामला है तो आपको देगा। –

+0

हां, लेकिन यह निम्न प्रारूप/main.aspx?page=KW1 KW2 + KW3 में एक गलत यूआरएल हल नहीं करेगा। –

0

आप इस कोशिश कर सकते हैं:

Request.QueryString["page"].Trim(); 
संबंधित मुद्दे