मुझे अपने रीट्रिएटRule के आधार पर एक डबल ट्रेलिंग स्लैश क्यों मिलता है?


9

मैं गैर-www URL के लिए सभी www अनुरोधों को निर्देशित करने के लिए निम्नलिखित कोड का उपयोग कर रहा हूं:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.example\.org$ [NC]
RewriteRule ^(.*)$ http://example.com/$1 [R=301,L]

यह मेरी वेबसाइट के रूट में एक .htaccess फ़ाइल के अंदर शानदार काम करता है।
उदाहरण के लिए,
www.example.com -> example.com/
www.example.com/ -> example.com/
www.example.com/other_page -> उदाहरण - bother.com पृष्ठ

हालाँकि, यदि मैं अपने VirtualHost कॉन्फ़िगरेशन में इसी कोड को स्थानांतरित करता हूं, तो फिर से लिखे गए URL में दोहरा अनुगामी स्लैश होता है।
www.example.com -> example.com//
www.example.com/ -> example.com//
www.example.com/other_page -> example.com www.otherample.com/

मैंने इसे फिर से लिखना नियम से स्लैश को हटाकर तय किया:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.example\.org$ [NC]
RewriteRule ^(.*)$ http://example.com$1 [R=301,L]

लेकिन मैं इसका कारण नहीं समझ सकता। किसी को पता है क्यों?

जवाबों:


10

जैसा कि मैं इसे समझता हूं, .htaccess फ़ाइलों में, आपके नियम में mod_rewrite प्रक्रियाएँ जो स्ट्रिंग है। वह निर्देशिका .htaccess फ़ाइल के सापेक्ष है, इसलिए इसमें प्रारंभ में / a नहीं होगी।

VirtualHost प्रविष्टि में, स्ट्रिंग यह प्रक्रिया सर्वर के रूट के लिए निरपेक्ष है, और इसलिए / शामिल है।

यह कैसे mod_rewrite काम करता है में सूक्ष्म अंतर के लिए बनाता है।

यहाँ एक समान समस्या और समाधान वाला कोई है:

http://forum.modrewrite.com/viewtopic.php?p=56322&sid=77f72967f59200b5b5de174440234c3a

यह दोनों मामलों में काम करना चाहिए, मुझे लगता है कि मुझे अपने भागने की सही याद है:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.example\.org$ [NC]
RewriteRule ^\/?(.*?)$ http://example.com/$1 [R=301,L]

धन्यवाद! अब मैं समझता हूं कि क्यों, कम से कम। हालाँकि, क्या यह किसी कारण से $ 1 से पहले / मेरे मूल प्रश्न में दिखाए जाने से बेहतर है?
डेवकोरो

1
कोई बेहतर या बदतर नहीं, यह सिर्फ एक ब्लॉक है जिसे आप संदर्भ अंतर को संभालने के लिए वर्चुअलहॉट के .acaccess के बीच हर बार इसे संपादित किए बिना स्वैप कर सकते हैं। यदि आपका रास्ता आपके लिए काम करता है, तो इसके साथ रहें! :)
नियोबाइट

ओह यह सही है - आपका तरीका .htaccess और VirtualHost दोनों में काम करेगा। यह बेहतर IMO बनाता है :)
davekaro

4
मुझे @davekaro के समान ही समस्या थी और आपके समाधान की कोशिश की। अंतिम पंक्ति मेरे लिए काम नहीं की। RewriteRule ^/?(.*)$ http://example.com/$1 [R=301,L]चाल चली।
केनी रस्साचर

2

ऐसा इसलिए हो रहा है क्योंकि आप एक प्रारंभिक स्लैश को कैप्चर कर रहे हैं (.*)और फिर नए स्थान पर इससे पहले एक और स्लैश लागू कर रहे हैं /$1। ऐसा पहले नहीं हुआ क्योंकि mod_rewrite प्रति-निर्देशिका के संदर्भ में प्रति-सर्वर संदर्भ के विपरीत संचालित होने पर थोड़ा अलग व्यवहार करता है।

आप वैकल्पिक रूप से स्लैश को पूर्व-खाली करके इससे बच सकते हैं। इसके अतिरिक्त आप अपने अधिशेष डोमेन के साथ एक खाली VirtualHost में RedirectMatch का उपयोग कर सकते हैं, जो थोड़ा कम प्रसंस्करण बनाता है और क्लीनर को देख सकता है।

<VirtualHost *>
ServerName example.com
ServerAlias other.example.com
..
RedirectMatch permanent ^/?(.*) http://example.com/$1
</VirtualHost>


अच्छा लगा। मुझे रीडायरेक्टमैच अप्रोच पसंद है। मैं शायद इसके साथ जाऊंगा क्योंकि यह वास्तव में एक पुनर्निर्देशित है जिसे मैं पूरा करना चाहता हूं।
डेवकारो

1

मैं इस पोस्ट को पूर्णता के लिए शामिल कर रहा हूं।

अपाचे प्रलेखन बताता है कि क्यों इस व्यवहार को बहुत अच्छी तरह से होता है और कारण यह है कि 'RewriteBase' निर्देश मौजूद है।

बस अपनी .htaccess फ़ाइल में 'रिवर्टबेस' निर्देश को सम्मिलित कर अपना वांछित परिणाम प्राप्त करें।

उदाहरण:

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^www\.example\.org$ [NC]
RewriteRule ^(.*)$ http://example.com/$1 [R=301,L]

अपाचे 2.2 mod_rewrite प्रलेखन से:

रिवाइटरबेस निर्देश स्पष्ट रूप से प्रति-निर्देशिका पुनर्लेखन के लिए आधार URL सेट करता है।

अंगूठे का मेरा नियम लगभग हमेशा .htaccess फ़ाइलों में 'RewriteBase' का उपयोग करना है, और Apache कॉन्फिगर में इसका उपयोग नहीं करना है।


0

मेरे पास इस मुद्दे को संभालने का कोई समय नहीं था इसलिए बस फिर से लिखना / // :)

RewriteCond %{THE_REQUEST} //
RewriteRule ^(.*)$ http://domain.com [R=301,L]
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.