2010-01-21 17 views
8

में चयनित क्वेरी स्ट्रिंग पैरामीटर के साथ यूआरएल को पुनर्लेखन करना मैंने हाल ही में अपना सीएमएस बदल दिया है, और नए यूआरएल/क्वेरी स्ट्रिंग पैरामीटर प्रारूप से मेल खाने के लिए अपने कुछ यूआरएल को फिर से लिखना चाहता हूं।.htaccess

पुराने URL था:

http://www.mysite.com/search.cgi?tag=foo&blog_id=bar&other=baz 

नया URL होना चाहिए:

http://www.mysite.com/?s=foo 

दूसरे शब्दों में, वहाँ पुराने स्वरूप में कई क्वेरी स्ट्रिंग पैरामीटर थे, लेकिन मैं केवल पुनर्लेखन के लिए परवाह टैग पैरामीटर एस समान मान रखते हुए। अन्य मानकों को त्याग दिया जाना चाहिए। बेशक पैरामीटर के आदेश से कोई फर्क नहीं पड़ता। इससे कोई फर्क नहीं पड़ता कि टैग एकमात्र पैरामीटर है या नहीं।

कोई भी विचार?

उत्तर

10

यदि आपका सर्वर इसका समर्थन करता है, तो आप नियमित अभिव्यक्ति और समूहकरण का उपयोग करने का प्रयास कर सकते हैं। मैं गलत नहीं कर रहा हूँ, तो आप केवल एक पैरामीटर के पुनर्लेखन के लिए है, मुझे लगता है कि (यदि आप mod_rewrite के साथ अपाचे का उपयोग कर रहे हैं) आप की तरह कुछ की कोशिश कर सकते:

 
RewriteCond %{QUERY_STRING} ^.*(\btag\b=(\w+|&\w+;)+) 
RewriteRule ^(.+) /$1?%1 [L] 

संपादित करें: मैं नियमित अभिव्यक्ति के लिए एक छोटा सा सुधार क्वेरी स्ट्रिंग में अपनी स्थिति के बावजूद "टैग" मैच करें और & जैसे विशेष वर्ण अनुक्रमों को संरक्षित करने के लिए इसके अलावा इसे समान पैरामीटर वाले मैचों से बचना चाहिए (यानी: यह "अल्टाग" नामक पैरामीटर से मेल नहीं खाता है)।

संपादित करें # 2: एक विकल्प (विशेष रूप से यदि आपको कई पैरामीटर फ़िल्टर करना है) तो पुनर्लेखन करने के लिए बाहरी प्रोग्राम का उपयोग करना है। यह पृष्ठ: http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewritemap (विशेष रूप से अनुभाग "बाहरी पुनर्लेखन कार्यक्रम") में उपयोगी जानकारी है।

+0

तो रिवाइटरूले में% 1 रीवाइटकॉन्ड में नियमित अभिव्यक्ति मिलान को दर्शाता है? – lupefiasco

+2

हां,% 1 का उपयोग रीव्राइटकंड में किसी समूह को संदर्भित करने के लिए किया जाता है, जबकि $ 1 का उपयोग रीवाइटरूल निर्देश में किसी समूह को संदर्भित करने के लिए किया जाता है। –

+0

और मैं अपने reewiteUrl को विशेष रूप से /search.cgi को मानचित्र बनाने के लिए कैसे स्थापित करूं? ... भाग /? ... – lupefiasco

2

किसी Apache वेबसर्वर पर, अपने दस्तावेज़ जड़ में .htaccess में निम्नलिखित नियम रखने URL पुनः लिखने, जैसा कि आप वर्णित:

RewriteCond %{QUERY_STRING} .*\btag=([^&]*).* 
RewriteRule ^search\.cgi /?s=%1 [R=302] 

शासन के ऊपर एक 302 रीडायरेक्ट का उपयोग करता है, तो आपके ब्राउज़र "याद नहीं है "आप परीक्षण कर रहे हैं और नियम tweaking जब रीडायरेक्ट नियम। एक बार परीक्षण करने के बाद, [आर] से [आर = 301] बदलें। एक 301 स्थायी पुनर्निर्देशन है, और एसईओ के लिए बेहतर है।

+0

इसे 's' पैरामीटर के साथ रीडायरेक्ट करना चाहिए, और यह अनुरोध के रूप में काम करेगा। – goodeye

+0

आप पर वापस ठीक है। +1 – goodeye

1

ओपी का अर्थ विशेष रूप से प्राप्त करने के लिए यहां एक और संस्करण है। @ smhmic का जवाब इसके करीब है। मैं शब्द-सीमा दृष्टिकोण के बजाय पैरामीटर को खोजने के लिए स्पष्ट शुरुआत-या-एम्परसेंड पसंद करता हूं। (स्वीकार किए जाते हैं जवाब बहुत ज्यादा जटिल है, और कुछ मुद्दे हैं।)

RewriteCond %{QUERY_STRING} (?:^|&)tag=([^&]*) 
RewriteRule ^search\.cgi$ /?s=%1 [NC,R=302] 

यह कह रहा है:
(?: ) एक% संख्या क्वेरी स्ट्रिंग की या एक ampersand के बाद शुरुआत में
^|& के रूप में इस पर कब्जा नहीं है (यह शब्द सीमा की तरह कार्य करता है, लेकिन विशेष रूप से यूआरएल के लिए)।
tag= हम जिस परम तलाश रहे हैं।
( ) इसे% 1 में कैप्चर करें।
[^&]* शून्य या अधिक वर्ण एक एम्पर्सेंड नहीं हैं (और एम्परसैंड पर रोक रहे हैं या अंत तक चल रहे हैं)।

+0

यह _almost_ बिल्कुल मेरा समाधान है, लेकिन रेगेक्स अधिक सटीक है। +1 –