RewriteBase
केवल एक रिश्तेदार पुनर्लेखन नियम के लक्ष्य पर लागू होता है ।
इस तरह से RewriteBase का उपयोग कर ...
RewriteBase /folder/
RewriteRule a\.html b.html
अनिवार्य रूप से के रूप में ही है ...
RewriteRule a\.html /folder/b.html
लेकिन जब .htaccess फ़ाइल अंदर होती है /folder/
तो यह भी उसी लक्ष्य की ओर इशारा करती है:
RewriteRule a\.html b.html
यद्यपि डॉक्स हमेशा एक का उपयोग कर रहे हैं RewriteBase
, अपाचे आमतौर पर जब तक कि यह DocumentRoot के तहत पथ के लिए सही ढंग से पता नहीं लगाता है:
इन मामलों में, आप पा सकते हैं कि आपको रिवाइटरबेस निर्दिष्ट करने की आवश्यकता है।
हालाँकि, चूंकि यह एक भ्रमित करने वाला निर्देश है, इसलिए आम तौर पर अपने संपूर्ण लक्ष्यों में यूआरआई को केवल निरपेक्ष (उर्फ 'मूल रिश्तेदार') निर्दिष्ट करना बेहतर होता है। आपके नियमों को पढ़ने वाले अन्य डेवलपर इन्हें और अधिक आसानी से समझेंगे।
यहां जॉन लिन के उत्कृष्ट उत्तर का उद्धरण देते हुए :
Htaccess फ़ाइल में, mod_rewrite एक <Directory>
या <Location>
कंटेनर के समान काम करता है । और RewriteBase
इसका उपयोग एक रिश्तेदार पथ आधार प्रदान करने के लिए किया जाता है।
उदाहरण के लिए, मान लें कि आपके पास यह फ़ोल्डर संरचना है:
DocumentRoot
|-- subdir1
`-- subdir2
`-- subsubdir
तो आप पहुँच सकते हैं:
http://example.com/
(रूट)
http://example.com/subdir1
(Subdir1)
http://example.com/subdir2
(Subdir2)
http://example.com/subdir2/subsubdir
(Subsubdir)
URI जो एक के माध्यम से भेजा जाता RewriteRule
है वह htaccess फ़ाइल वाली निर्देशिका के सापेक्ष है। इसलिए यदि आपके पास:
RewriteRule ^(.*)$ -
- रूट htaccess में, और अनुरोध है
/a/b/c/d
, तब कैप्चर किया गया URI ( $1
) है a/b/c/d
।
- यदि नियम में है
subdir2
और अनुरोध है /subdir2/e/f/g
तो कब्जा कर लिया गया यूआरआई है e/f/g
।
- यदि नियम में है
subsubdir
, और अनुरोध है /subdir2/subsubdir/x/y/z
, तो कब्जा कर लिया गया URI है x/y/z
।
नियम है कि निर्देशिका है कि भाग URI से दूर छीन लिया है। पुनर्लेखन आधार का इस पर कोई प्रभाव नहीं है, यह बस प्रति-निर्देशिका कैसे काम करता है।
क्या फिर से लिखने के आधार करता करते हैं, एक यूआरएल-पथ आधार (प्रदान करना है न में किसी भी संबंधित पथ के लिए एक फ़ाइल पथ आधार) नियम के लक्ष्य । तो कहते हैं कि आपके पास यह नियम है:
RewriteRule ^foo$ bar.php [L]
bar.php
के रूप में करने का विरोध किया, एक रिश्तेदार पथ है:
RewriteRule ^foo$ /bar.php [L]
जहां /bar.php
एक परम मार्ग है। पूर्ण पथ हमेशा "रूट" (ऊपर निर्देशिका संरचना में) होगा। इसका मतलब यह है कि नियम "मूल", "उपदिर 1", "उपसुबिर" आदि में है, इस बात पर ध्यान दिए बिना कि /bar.php
मार्ग हमेशा के लिए मैप करता है http://example.com/bar.php
।
लेकिन अन्य नियम, सापेक्ष पथ के साथ, यह उस निर्देशिका पर आधारित है जो नियम में है
RewriteRule ^foo$ bar.php [L]
"रूट" में है और आप जाते हैं http://example.com/foo
, आप सेवा करते हैं http://example.com/bar.php
। लेकिन अगर वह नियम "subdir1" निर्देशिका में है, और आप जाते हैं http://example.com/subdir1/foo
, तो आपको सेवा दी जाती है http://example.com/subdir1/bar.php
। आदि। यह कभी-कभी काम करता है और कभी-कभी ऐसा नहीं होता है, जैसा कि दस्तावेज कहता है, यह सापेक्ष पथों के लिए आवश्यक माना जाता है , लेकिन अधिकांश समय यह काम करने के लिए लगता है। सिवाय जब आप पुनर्निर्देशित कर रहे हों ( R
झंडे का उपयोग करना , या अंतर्निहित रूप से क्योंकि आप http://host
अपने शासन के लक्ष्य में हैं)। इसका मतलब है कि यह नियम:
RewriteRule ^foo$ bar.php [L,R]
अगर यह "subdir2" निर्देशिका में है, और आप के पास जाओ http://example.com/subdir2/foo
, mod_rewrite एक फ़ाइल पथ एक यूआरएल-पथ के बजाय के रूप में रिश्तेदार पथ गलती होगी और की वजह से R
झंडा, आप की तरह कुछ पर पुनर्निर्देशित हो खत्म होगी: http://example.com/var/www/localhost/htdocs/subdir1
। जो स्पष्ट रूप से वह नहीं है जो आप चाहते हैं।
यह वह जगह है जहाँ RewriteBase
आता है। निर्देश mod_rewrite बताता है कि हर रिश्तेदार पथ की शुरुआत में क्या करना है। तो अगर मेरे पास है:
RewriteBase /blah/
RewriteRule ^foo$ bar.php [L]
"सबसुबिर" में, http://example.com/subdir2/subsubdir/foo
वास्तव में मेरी सेवा करेगा http://example.com/blah/bar.php
। आधार के अंत में "bar.php" जोड़ा जाता है। व्यवहार में, यह उदाहरण आमतौर पर आप क्या चाहते हैं, क्योंकि आपके पास एक ही निर्देशिका कंटेनर या htaccess फ़ाइल में कई आधार नहीं हो सकते हैं।
ज्यादातर मामलों में, यह इस तरह से उपयोग किया जाता है:
RewriteBase /subdir1/
RewriteRule ^foo$ bar.php [L]
जहाँ वे नियम "subdir1" निर्देशिका में होंगे और
RewriteBase /subdir2/subsubdir/
RewriteRule ^foo$ bar.php [L]
"सबसुबिर" निर्देशिका में होगा।
यह आंशिक रूप से आपको अपने नियमों को पोर्टेबल बनाने की अनुमति देता है, इसलिए आप उन्हें किसी भी निर्देशिका में छोड़ सकते हैं और केवल नियमों के एक समूह के बजाय आधार को बदलने की आवश्यकता है। उदाहरण के लिए यदि आपके पास था:
RewriteEngine On
RewriteRule ^foo$ /subdir1/bar.php [L]
RewriteRule ^blah1$ /subdir1/blah.php?id=1 [L]
RewriteRule ^blah2$ /subdir1/blah2.php [L]
...
जैसे कि http://example.com/subdir1/foo
सेवा करने जा रहे हैं http://example.com/subdir1/bar.php
आदि और कहते हैं कि आपने उन सभी फाइलों और नियमों को "सबसुबिर" निर्देशिका में स्थानांतरित करने का निर्णय लिया है। के प्रत्येक उदाहरण बदलने की बजाय /subdir1/
करने के लिए /subdir2/subsubdir/
, तुम सिर्फ एक आधार था हो सकता था:
RewriteEngine On
RewriteBase /subdir1/
RewriteRule ^foo$ bar.php [L]
RewriteRule ^blah1$ blah.php?id=1 [L]
RewriteRule ^blah2$ blah2.php [L]
...
और फिर जब आपको उन फ़ाइलों और नियमों को किसी अन्य निर्देशिका में स्थानांतरित करने की आवश्यकता होती है, तो बस आधार बदलें:
RewriteBase /subdir2/subsubdir/
और बस।