2012-10-13 20 views
25

मैं एक यूआरएल को किसी अन्य पेज पर mod_rewrite करना चाहता हूं, लेकिन फिर भी मैं चाहता हूं कि कोई क्वेरी स्ट्रिंग संरक्षित हो।मैं mod_rewrite कैसे कर सकता हूं और क्वेरी स्ट्रिंग्स रख सकता हूं?

RewriteEngine On 

#enforce trailing slashes 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_URI} !# 
RewriteCond %{REQUEST_URI} !(.*)/$ 
RewriteRule ^(.*)$ http://localhost/siteroot/$1/ [L,R=301] 

RewriteRule ^apps/([A-Za-z0-9-_]+)/?$ index.php&app=$1 

तो कोई उपयोगकर्ता apps/app1/, index.php?app=app1 दिखाया गया है यदि। हालांकि, मैं वैकल्पिक क्वेरी स्ट्रिंग को संरक्षित करने में सक्षम होना चाहता हूं, ताकि apps/app1/?variable=x पर जाकर index.php?app=app1&variable=x लौटा सकें।

क्या mod_rewrite नियम/स्थिति यह घटित होगी?

उत्तर

49

आप के रूप में इस तरह के आंतरिक पुनर्लेखन करने का विरोध किया [QSA] flag ("क्वेरी स्ट्रिंग संलग्न") जोड़ने के लिए [R] ध्वज के साथ

RewriteRule ^apps/([A-Za-z0-9-_]+)/?$ index.php&app=$1 [L,QSA] 

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

+0

धन्यवाद, मुझे नहीं पता था कि यह इतना आसान था। –

+1

+1 @DanielOakey के साथ सहमत हैं .. मैं रेगेक्स के साथ कुछ हैक करने की कोशिश कर रहा था और यह काम नहीं कर रहा था .. –

+2

स्पष्टीकरण के लिए, यह पुनर्लेखन बनाम पुनर्निर्देशन के बारे में नहीं है। http://httpd.apache.org/docs/current/rewrite/flags.html#flag_qsa कहते हैं: जब प्रतिस्थापन यूआरआई में एक क्वेरी स्ट्रिंग होती है, तो रीवाइटरूल का डिफ़ॉल्ट व्यवहार मौजूदा क्वेरी स्ट्रिंग को त्यागना और इसे प्रतिस्थापित करना है नव निर्मित एक के साथ। [क्यूएसए] ध्वज का उपयोग क्वेरी स्ट्रिंग को संयुक्त करने का कारण बनता है। –