2011-06-14 17 views
7

मेरे पास निम्न URL ...मैं कैसे एक नियम के मैच के लिए mod_rewrite प्राप्त कर सकते हैं बस एक बार

http://localhost/http.mygarble.com/foundationsofwebprogramming/86

... कि मैं निम्नलिखित में कनवर्ट करना चाहते हैं:

http://localhost/http.mygarble.com/php/blog.php?subdomain=foundationsofwebprogramming&page=posts&label=86

मैंने सोचा कि मैं निम्नलिखित नियम के साथ इस लक्ष्य को हासिल कर सकते हैं:

RewriteRule ([^/]+)/([^/]+)$ php/blog.php?subdomain=$1&page=post&label=$2 [NC,L] 

हालांकि मुझे क्या लगता है कि यह नियम बार-बार लागू होता है, जिसके परिणामस्वरूप आंतरिक सर्वर त्रुटि होती है। मैं समझता हूं कि जब इस नियम का उपयोग करते हुए यूआरआई बदल जाता है, परिणामी यूआरआई भी नियम से मेल खाता है, और इसलिए इसे विज्ञापन-infinitum फिर से लागू किया जाता है।

मेरे पिछले (वैसे नहीं बल्कि धुंधला) समझ गया था कि [एल] ध्वज आगे की प्रक्रिया बंद कर देंगे, हालांकि मैं अब समझता हूँ कि इस का अर्थ है कि केवल नियमों के शेष को छोड़ दिया जाता है, और रीराइट इंजन चल रहा है बंद नहीं होता नियमों के माध्यम से फिर से।

मैं निम्नलिखित शर्त जोड़कर इस समस्या को ठीक कर सकते हैं ...

RewriteCond $0 !php/blog.php 
RewriteRule ([^/]+)/([^/]+)$ php/blog.php?subdomain=$1&page=post&label=$2 [NC,L] 

... या अधिक स्पष्ट रूप नियमित अभिव्यक्ति लिख कर। लेकिन मैं वास्तव में क्या करना चाहता हूं, इस नियम को एक बार मेल खाने के बाद किसी और मैच का प्रयास करने से पुनः लिखने वाले इंजन को रोकने का एक तरीका मिल गया है। क्या यह संभव है?

बहुत धन्यवाद।

उत्तर

16

आमतौर पर 2 विधियों का उपयोग किया जाता है।

पहला एक रिवाइट कंडीशन परीक्षण है कि अनुरोध की गई फ़ाइल वास्तविक फ़ाइल नहीं है। जब आंतरिक रिकर्सन उत्पन्न होता है तो आपका php/blog.php एक वास्तविक फ़ाइल है और पुनः लिखने के लिए दूसरी बार निष्पादित नहीं किया जाता है। पक्ष प्रभाव मौजूद है जो फिर से लिखा नहीं किया जाएगा किसी फ़ाइल के लिए किसी भी अनुरोध (जो अच्छा पक्ष प्रभाव हो सकता है)

RewriteCond %{REQUEST_FILENAME} !-f 

दूसरा उपाय है कि आप के साथ एक आंतरिक पुनर्निर्देशन में नहीं कर रहे हैं की जाँच करने के है जो:

RewriteCond %{ENV:REDIRECT_STATUS} ^$ 

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

संपादित

पूरा होने के लिए मैं एक तिहाई विधि जोड़ देगा: [एन एस] या [nosubreq] टैग ही बात कर रहा है। आंतरिक पुनर्निर्देशन के बाद नियम उपयोग को रोकना।

+0

दूसरा समाधान आदर्श है। केवल एक ही रीडायरेक्ट जो मैं चाहता हूं बाहरी हैं, सभी नियम केवल एक बार चलने के लिए हैं। धन्यवाद कृपया। –

+0

दुर्भाग्यवश मेरे पास आपके उत्तर को वोट देने की प्रतिष्ठा नहीं है, शायद कोई मेरी तरफ से ऐसा करेगा। एक बार फिर धन्यवाद। –

+0

@ जेम्स स्मिथ: आपको मेरे उत्तर को ऊपर उठाने की आवश्यकता नहीं है, आपको बस इसे "स्वीकार" करना चाहिए (ताकि मुझे हरा मार्कअप मिल गया हो)। – regilero

4

और तीसरा विधि 2.3.9 या उच्चतर के लिए अपाचे के उन्नयन और [अंत] के बजाय [एल] ध्वज का प्रयोग है।

कोई साइड इफेक्ट्स

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