कैसे। में काम करता है


227

मैंने इसे कुछ .htaccessउदाहरणों में देखा है

RewriteBase /

यह <base href="">HTML की कार्यक्षमता में कुछ हद तक समान प्रतीत होता है ।

मेरा मानना ​​है कि यह RewriteRuleबयानों की शुरुआत में अपने मूल्य को स्वचालित रूप से बढ़ा सकता है (संभवतः एक प्रमुख स्लैश के बिना)?

मुझे ठीक से काम करने के लिए नहीं मिला। मुझे लगता है कि इसका उपयोग साइट पोर्टेबिलिटी के लिए बहुत काम आ सकता है, क्योंकि मेरे पास अक्सर एक विकास सर्वर होता है जो उत्पादन के लिए अलग होता है। मेरा वर्तमान तरीका मुझे मेरे RewriteRuleबयानों से कुछ हिस्सों को हटाने के लिए छोड़ देता है ।

क्या कोई मुझे संक्षेप में समझा सकता है कि इसे कैसे लागू किया जाए?

धन्यवाद



RewriteBase केवल निर्देशिका या .htaccess संदर्भ में काम करता है ... लिंक @SalmanPK के लिए संदर्भ देखें।
एडी बी

1
अच्छे विवरण के लिए यह उत्तर देखें। stackoverflow.com/a/2137593/292060
goodeye

1
यह एक अधिक गहराई से उत्तर है: stackoverflow.com/a/21348047/632951
2

यह एक 1-लाइन उत्तर है: stackoverflow.com/a/46541685/632951
पेसियर

जवाबों:


102

मेरे अपने शब्दों में, डॉक्स पढ़ने और प्रयोग करने के बाद:

आप अपने पुनर्लेखन के लिए आधारRewriteBase प्रदान करने के लिए उपयोग कर सकते हैं । इस पर विचार करो

# invoke rewrite engine
    RewriteEngine On
    RewriteBase /~new/

# add trailing slash if missing
    rewriteRule ^(([a-z0-9\-]+/)*[a-z0-9\-]+)$ $1/ [NC,R=301,L]

यह एक वास्तविक नियम है जिसका उपयोग मैंने यह सुनिश्चित करने के लिए किया कि URL में एक अनुगामी स्लैश है। यह रूपांतरित होगा

http://www.example.com/~new/page

सेवा

http://www.example.com/~new/page/

RewriteBaseवहाँ होने से , आप सापेक्ष पथ को RewriteBaseपैरामीटर से बाहर कर देते हैं।


10
"रिवर्टबेस पैरामीटर से बाहर आएँ" - क्या आपका मतलब फिर से लिखना है? :)
Kissaki

1
मैं htaccess पर कुछ विवरण साफ़ करना चाहता हूँ .. क्या ReWriteBase ने htaccess में सभी नियमों के लिए इसकी घोषणा के बाद इसे निर्धारित किया है ? क्या इसे हटाने का कोई तरीका है, क्या इसे रीसेट किया जा सकता है?
डेमन

3
@Kissaki: नहीं, $1parenthesised RewriteRule नमूने का मिलान, लेकिन खिलाड़ी को बदलने के रिश्तेदार पथ RewriteBase पैरामीटर बाहर आ जाता है। तो, परिणामस्वरूप प्रतिस्थापन है /~new/$1/
MrWhite

3
@Damon: कई निर्देशों के संबंध में यह प्रश्न देखें RewriteBase। संक्षेप में, आपके पास एक से अधिक नहीं हो सकते हैं - मुझे लगता है कि अंतिम RewriteBase निर्देश जीतता है, और पूरे .htaccess फ़ाइल को प्रभावित करता है।
MrWhite

24
-1; इस जवाब से लगता है कि दूसरों की मदद की है, लेकिन मेरे लिए पूरी तरह से अपारदर्शी है। मैं अनुमान लगाया सकता है कि "आप उपयोग कर सकते हैं RewriteBaseअपने पुनर्लेखन के लिए एक आधार प्रदान करने के लिए" - बस शब्दों का एक विपर्यय है कि काफी है - लेकिन मुझे नहीं पता कि क्या एक "आधार" है है इस संदर्भ में, और न ही कैसे का अर्थ यदि आपने RewriteBaseलाइन को हटा दिया है तो उदाहरण दिया जाएगा । मैनुअल पर मैं जा रहा हूँ ...
मार्क एमरी

89

RewriteBaseकेवल एक रिश्तेदार पुनर्लेखन नियम के लक्ष्य पर लागू होता है ।

  • इस तरह से RewriteBase का उपयोग कर ...

    RewriteBase /folder/
    RewriteRule a\.html b.html
    
  • अनिवार्य रूप से के रूप में ही है ...

    RewriteRule a\.html /folder/b.html
    
  • लेकिन जब .htaccess फ़ाइल अंदर होती है /folder/तो यह भी उसी लक्ष्य की ओर इशारा करती है:

    RewriteRule a\.html b.html
    

यद्यपि डॉक्स हमेशा एक का उपयोग कर रहे हैं RewriteBase, अपाचे आमतौर पर जब तक कि यह DocumentRoot के तहत पथ के लिए सही ढंग से पता नहीं लगाता है:

  • आप Aliasनिर्देशों का उपयोग कर रहे हैं

  • आप सापेक्ष URL के लिए HTTP पुनर्निर्देशन (केवल मौन पुनर्लेखन के बजाय) करने के लिए .htaccess rewrite नियमों का उपयोग कर रहे हैं

इन मामलों में, आप पा सकते हैं कि आपको रिवाइटरबेस निर्दिष्ट करने की आवश्यकता है।

हालाँकि, चूंकि यह एक भ्रमित करने वाला निर्देश है, इसलिए आम तौर पर अपने संपूर्ण लक्ष्यों में यूआरआई को केवल निरपेक्ष (उर्फ 'मूल रिश्तेदार') निर्दिष्ट करना बेहतर होता है। आपके नियमों को पढ़ने वाले अन्य डेवलपर इन्हें और अधिक आसानी से समझेंगे।



यहां जॉन लिन के उत्कृष्ट उत्तर का उद्धरण देते हुए :

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/

और बस।


मेरे लिए, मैं चूक गया RewriteEngine On। उदाहरण के लिए 1and1 पर कोई ज़रूरत नहीं है, लेकिन यह मेरे समर्पित सर्वर पर आवश्यक है।
पोर्टेकोई

41

AFAIK, RewriteBase केवल उन मामलों को ठीक करने के लिए उपयोग किया जाता है जहां mod_rewrite एक .htaccessफ़ाइल में नहीं चल रहा है एक साइट की जड़ में है और यह फ़ोल्डर के लिए गलत वेब पथ (जैसा कि फाइलसिस्टम पथ के विपरीत) का अनुमान लगाता है यह चल रहा है। इसलिए यदि आपके पास एक है उस फ़ोल्डर में एक .htaccess में पुन: लिखें, जिसका http://example.com/myfolderउपयोग आप कर सकते हैं:

RewriteBase myfolder

यदि mod_rewrite सही तरीके से काम नहीं कर रहा है।

इस समस्या को ठीक करने के बजाय कुछ असामान्य हासिल करने के लिए इसका उपयोग करने की कोशिश करना, बहुत उलझन में डालने के लिए एक नुस्खा जैसा लगता है।


2
क्या यह एक अनुगामी स्लेश के साथ समाप्त करने की आवश्यकता है?
पेसियर

@ स्वयं, नहीं। परीक्षण किया गया है, और यहां उप-समझाया गया है: stackoverflow.com/a/11443194/632951
9

23

RewriteBase केवल उन स्थितियों में उपयोगी है जहाँ आप केवल अपनी साइट के मूल में .htaccess लगा सकते हैं। अन्यथा, आप अपनी अलग-अलग .htaccess फ़ाइलों को अपनी साइट की विभिन्न निर्देशिकाओं में रखने से बेहतर हो सकते हैं और पूरी तरह से RewriteBit निर्देश को छोड़ सकते हैं।

हाल ही में, जटिल साइटों के लिए, मैं उन्हें बाहर ले जा रहा हूं, क्योंकि यह परीक्षण से फाइलों को केवल एक और कदम जटिल रहने के लिए तैनात करता है।


22
हालाँकि यह अच्छी सलाह हो सकती है, लेकिन यह सवाल का जवाब नहीं है। इस प्रकार यह प्रश्न के लिए एक टिप्पणी होनी चाहिए, प्राप्त नहीं हुई है (कई के रूप में) उत्थान और निश्चित रूप से "उत्तर" के रूप में स्वीकार नहीं किया गया है।
Kissaki

3
"अपनी अलग .htaccess फ़ाइलों को अलग-अलग निर्देशिकाओं में रखने से बेहतर है" - मुझे यकीन नहीं है कि यह अच्छी सलाह है? आपकी साइट पर बिंदीदार .htaccess फाइलें होने से डिबगिंग / रखरखाव एक दुःस्वप्न बन सकता है। मैंने कहा था कि आपकी साइट के मूल में एक .htaccess फ़ाइल होना बेहतर होगा
MrWhite

1
@ w3d एक टाइमिंग बात भी है: हर बार एक सबडायरेक्ट्री एक्सेस हो जाती है, कई .htaccess फाइल्स को पार्स (रूट से करंट सबडायरेक्टिस) कर दिया जाता है। बहुत सारी फाइलें होने के कारण अनुरोध के समग्र उत्तर की गति कम हो सकती है, क्योंकि रूट में एक भी फाइल के विपरीत, भले ही इसमें बहुत सारे नियम हों ..
Erenor Paz

19

जब मैं विकसित होता हूं, तो यह एक फ़ोल्डर के भीतर एक अलग डोमेन पर होता है। जब मैं किसी साइट को लाइव करता हूं, तो वह फ़ोल्डर मौजूद नहीं होता है। RewriteBase का उपयोग करने से मुझे दोनों परिवेशों में समान .htaccess फ़ाइल का उपयोग करने की अनुमति मिलती है।

जब जीना:

RewriteBase /
# RewriteBase /dev_folder/

जब विकासशील:

# RewriteBase /
RewriteBase /dev_folder/

4
मुझे यकीन है कि यह हमेशा काम नहीं करेगा। क्या होगा यदि आप उदाहरण के लिए %{REQUEST_URI}एक RewriteCondनिर्देश में इस्तेमाल करते हैं?
MrWhite

1
@ user1669830, अगर आपको सिर्फ एक पुनर्लेखिका मिली है, तो आप बस आधार को rewriterule stackoverflow.com/a/46541685/632951
Pacerier

18

मुझे जो स्पष्ट विवरण मिला, वह वर्तमान 2.4 अपाचे डॉक्स में नहीं, बल्कि संस्करण 2.0 में था

#  /abc/def/.htaccess -- per-dir config file for directory /abc/def
#  Remember: /abc/def is the physical path of /xyz, i.e., the server
#            has a 'Alias /xyz /abc/def' directive e.g.

RewriteEngine On

#  let the server know that we were reached via /xyz and not
#  via the physical path prefix /abc/def
RewriteBase   /xyz

यह कैसे काम करता है? आपके लिए हैकर्स को अपाचे करने के लिए, यह 2.0 डॉक "आंतरिक प्रसंस्करण चरणों के बारे में विस्तृत जानकारी" देता है।

सबक सीखा: जबकि हमें "वर्तमान" से परिचित होने की आवश्यकता है, जवाहरात एनाल्स में पाए जा सकते हैं।


3

यह कमांड स्पष्ट रूप से आपके पुनर्लेखन के लिए आधार URL सेट कर सकता है। यदि आप अपने डोमेन के मूल में शुरू करना चाहते हैं, तो आप अपने रिवर्ट्यूल से पहले निम्नलिखित पंक्ति को शामिल करेंगे:

RewriteBase /

2

मेरा मानना ​​है कि अपाचे प्रलेखन से यह अंश, पिछले उत्तरों को अच्छी तरह से पूरक करता है:

यह निर्देश तब आवश्यक है जब आप प्रति-निर्देशिका (htaccess) संदर्भ में प्रतिस्थापन में किसी सापेक्ष पथ का उपयोग करें जब तक कि निम्नलिखित में से कोई भी स्थिति सत्य न हो:

  • मूल अनुरोध, और प्रतिस्थापन, डॉक्यूमेंटरूट के नीचे हैं (जैसा कि अन्य साधनों द्वारा उपलब्ध होने के विपरीत है, जैसे कि एलियास)।

  • रीवेरिटआर्यूल युक्त निर्देशिका के लिए फाइलसिस्टम पथ, सापेक्ष प्रतिस्थापन द्वारा प्रत्यय भी सर्वर पर एक URL पथ के रूप में मान्य है (यह दुर्लभ है)।

जैसा कि पहले उल्लेख किया गया है, अन्य संदर्भों में, यह केवल आपके नियम को कम करने के लिए उपयोगी है। इसके अलावा, जैसा कि पहले बताया गया है, आप उसी चीज़ को उपनिर्देशिका में htaccess फ़ाइल रखकर प्राप्त कर सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.