[Apache] Mod_rewrite की छिपी हुई विशेषताएं


Answers

यदि आपको .htaccess में होने से आंतरिक रीडायरेक्ट / पुनर्लेखन को 'अवरुद्ध' करने की आवश्यकता है, तो एक नज़र डालें

RewriteCond %{ENV:REDIRECT_STATUS} ^$

जैसा कि यहां चर्चा की गई है

Question

ऐसा लगता है कि इसके कुछ पहलुओं कैसे काम करते हैं, इस बारे में कुछ भ्रम के साथ हाल ही में mod_rewrite धागे की एक सभ्य संख्या है। नतीजतन मैंने सामान्य कार्यक्षमता पर कुछ नोट्स संकलित किए हैं, और शायद कुछ कष्टप्रद बारीकियां।

mod_rewrite का उपयोग करके आप किन अन्य सुविधाओं / सामान्य मुद्दों को चलाते हैं?




[एल] ध्वज की बेहतर समझ क्रम में है। [एल] ध्वज आखिरी है, आपको बस यह समझना होगा कि यूआरएल पार्सिंग इंजन के माध्यम से आपके अनुरोध को फिर से रूट करने का क्या कारण होगा। दस्तावेज़ों से ( http://httpd.apache.org/docs/2.2/rewrite/flags.html#flag_l ) (जोर मेरा):

[एल] ध्वज नियम सेट को संसाधित करना बंद करने के लिए mod_rewrite का कारण बनता है। अधिकांश संदर्भों में, इसका मतलब है कि यदि नियम मेल खाता है, तो कोई और नियम संसाधित नहीं किया जाएगा। यह पर्ल में अंतिम आदेश, या सी में ब्रेक कमांड से मेल खाता है। इस ध्वज का उपयोग यह इंगित करने के लिए करें कि वर्तमान नियम तुरंत नियमों पर विचार किए बिना लागू किया जाना चाहिए।

यदि आप किसी भी। Htaccess फ़ाइलों में या <Directory> अनुभागों में RewriteRule का उपयोग कर रहे हैं, तो नियमों को संसाधित करने के तरीके के बारे में कुछ समझना महत्वपूर्ण है। इसका सरलीकृत रूप यह है कि नियमों को संसाधित करने के बाद, पुनः लिखा अनुरोध यूआरएल पार्सिंग इंजन को सौंप दिया जाता है ताकि वह इसके साथ क्या कर सके। यह संभव है कि पुनर्लेखन अनुरोध को संभाला जा सके, .htaccess फ़ाइल या <Directory> अनुभाग का फिर से सामना किया जा सकता है, और इस प्रकार नियमसेट को शुरुआत से फिर से चलाया जा सकता है। आमतौर पर यह तब होगा जब नियमों में से एक रीडायरेक्ट का कारण बनता है - या तो आंतरिक या बाहरी - अनुरोध प्रक्रिया शुरू होने का कारण बनता है।

इसलिए [एल] ध्वज नियम सेट के माध्यम से उस पास के लिए किसी और पुनः लिखने के नियमों को संसाधित करना बंद कर देता है । हालांकि, यदि आपका नियम [एल] के साथ चिह्नित है, तो अनुरोध को संशोधित किया गया है, और आप .htaccess संदर्भ या <Directory> अनुभाग में हैं, तो आपका संशोधित अनुरोध URL पार्सिंग इंजन के माध्यम से फिर से पारित किया जा रहा है। और अगले पास, यह इस समय एक अलग नियम से मेल खा सकता है। यदि आपको समझ में नहीं आता कि क्या हुआ, तो ऐसा लगता है कि [एल] ध्वज के साथ आपका पहला पुनर्लेखन नियम कोई प्रभाव नहीं पड़ा।

[एल] ध्वज के बजाय [END] ध्वज ( http://httpd.apache.org/docs/current/rewrite/flags.html#flag_end ) का उपयोग करने के लिए इसका सबसे अच्छा तरीका है, अगर आप वास्तव में रुकना चाहते हैं नियमों के सभी आगे प्रसंस्करण (और बाद में reparsing)। हालांकि, [END] ध्वज केवल अपाचे v2.3.9 + के लिए उपलब्ध है, इसलिए यदि आपके पास v2.2 या इससे कम है, तो आप केवल [एल] ध्वज के साथ फंस गए हैं। इस मामले में, आपको यूआरएल पार्सिंग इंजन के बाद के पासों पर नियमों के मिलान को रोकने के लिए रिवाइटकंड स्टेटमेंट पर भरोसा करना चाहिए। या आपको यह सुनिश्चित करना होगा कि आपका रिवाइटरूल एक संदर्भ में है (यानी httpd.conf) जो आपके अनुरोध को फिर से पारदर्शी नहीं करेगा।




अन्य नुकसान:

1- कभी-कभी मल्टीव्यू को अक्षम करना अच्छा विचार है

Options -MultiViews

मैं सभी मल्टीव्यू क्षमताओं पर अच्छी तरह से कविता नहीं हूं, लेकिन मुझे पता है कि यह सक्रिय होने पर मेरे mod_rewrite नियमों को गड़बड़ कर देता है, क्योंकि इसकी एक संपत्ति एक फ़ाइल को एक एक्सटेंशन का अनुमान लगाने और अनुमान लगाने के लिए है जिसे मैं सोचता हूं ।

मैं समझाऊंगा: मान लें कि आपके पास अपने वेब डीआईआर, file1.php और file2.php में 2 php फ़ाइलें हैं और आप इन शर्तों को जोड़ते हैं और अपने .htaccess पर नियम डालते हैं:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ file1.php/$1 

आप मानते हैं कि सभी यूआरएल जो फ़ाइल या निर्देशिका से मेल नहीं खाते हैं उन्हें file1.php द्वारा पकड़ा जाएगा। आश्चर्य! यूआरएल http://myhost/file2/somepath लिए यह नियम सम्मानित नहीं किया जा रहा है। इसके बजाय आपको file2.php के अंदर ले जाया गया है।

क्या हो रहा है कि http://myhost/file2.php/somepath ने http://myhost/file2.php/somepath से अनुमान लगाया है कि आप जिस यूआरएल को वास्तव में चाहते थे वह http://myhost/file2.php/somepath और खुशी से आपको वहां ले गया।

अब, आपके पास अभी कोई घटना नहीं है और आप उस बिंदु पर हैं जो आपने सोचा था कि आप mod_rewrite के बारे में जानते थे। फिर आप इस नई परिस्थिति के पीछे तर्क की भावना को समझने के लिए नियमों के साथ खेलना शुरू करते हैं, लेकिन जितना अधिक आप कम समझ का परीक्षण कर रहे हैं।

ठीक है, संक्षेप में यदि आप mod_rewrite को ऐसे तरीके से काम करना चाहते हैं जो तर्क को अनुमानित करता है, तो मल्टीव्यूज़ को बंद करना सही दिशा में एक कदम है।

2- FollowSymlinks सक्षम करें

Options +FollowSymLinks 

वह एक, मुझे वास्तव में विवरण नहीं पता है, लेकिन मैंने इसे कई बार उल्लेख किया है, तो बस इसे करें।




mod_rewrite यूआरएल को बदलने के बिना अनुरोध हैंडलिंग के पहलुओं को संशोधित कर सकता है, उदाहरण के लिए पर्यावरण चर सेट करना, कुकीज़ सेट करना आदि। यह अविश्वसनीय रूप से उपयोगी है।

सशर्त रूप से एक पर्यावरण चर सेट करें:

RewriteCond %{HTTP_COOKIE} myCookie=(a|b) [NC]
RewriteRule .* - [E=MY_ENV_VAR:%b]

503 प्रतिक्रिया दें: RewriteRule का [R] ध्वज गैर-3xx मान ले सकता है और एक गैर-रीडायरेक्टिंग प्रतिक्रिया लौटा सकता है, उदाहरण के लिए प्रबंधित डाउनटाइम / रखरखाव के लिए:

RewriteRule .* - [R=503,L]

एक 503 प्रतिक्रिया लौटाएगा (प्रति रीडायरेक्ट नहीं)।

इसके अलावा, mod_rewrite mod_proxy पर एक सुपर-पावर इंटरफ़ेस की तरह कार्य कर सकता है, इसलिए आप ProxyPass निर्देश लिखने के बजाय ऐसा कर सकते हैं:

RewriteRule ^/(.*)$ balancer://cluster%{REQUEST_URI} [P,QSA,L]

राय: अनुरोध के लगभग किसी भी कल्पनीय पहलू के आधार पर विभिन्न अनुप्रयोगों या लोड बैलेंसर्स के अनुरोधों को रूट करने के लिए RewriteRule एस और RewriteCond एस का उपयोग करना बेहद शक्तिशाली है। बैकएंड के रास्ते पर अनुरोधों को नियंत्रित करना, और प्रतिक्रियाओं को उनके रास्ते पर संशोधित करने में सक्षम होना, सभी रूटिंग-संबंधित कॉन्फ़िगरेशन को केंद्रीकृत करने के लिए आदर्श स्थान mod_rewrite बनाता है।

इसे सीखने के लिए समय निकालें, यह इसके लायक है! :)