.htaccess mod_rewrite - निर्देशिका को फिर से लिखने के नियम से बाहर कैसे करें


145

मेरी .htaccess फ़ाइल में नियमों को फिर से लिखने की 8 पंक्तियाँ हैं। मुझे अपने सर्वर पर इन नियमों से दो भौतिक निर्देशिकाओं को बाहर करने की आवश्यकता है, ताकि वे सुलभ हो सकें। अभी के लिए सभी अनुरोधों को index.php फ़ाइल पर भेजा जाता है।

निर्देशिकाएँ बाहर करने के लिए: "व्यवस्थापक" और "उपयोगकर्ता"।

इसलिए http अनुरोध: http://www.domain.com/admin/ को index.php फ़ाइल में पारित नहीं किया जाना चाहिए।

ErrorDocument 404 /index.php?mod=error404

Options  FollowSymLinks
RewriteEngine On
RewriteBase /

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

RewriteRule ^([^/] )/([^/] )\.html$ index.php?lang=$1&mod=$2 [L]
RewriteRule ^([^/] )/$ index.php?lang=$1&mod=home [L]

मुझे लगता है कि आप [^/]एक सादे स्थान के बाद से क्वांटिफायर भूल गए, अगर वहां अनुमति नहीं है (इसे बच जाना चाहिए \<space>)।
गुम्बो

सच गुम्बो, अच्छी पकड़ :)। यह ^ ([^ /] +) होना चाहिए।
केल्विन

जवाबों:


287

अपने अन्य नियमों से पहले इस नियम का प्रयास करें:

RewriteRule ^(admin|user)($|/) - [L]

इससे पुनर्लेखन प्रक्रिया समाप्त हो जाएगी।


हेलो गुम्बो, आपके कोड ने काम किया अगर उपयोगकर्ता टाइप करें domain.com/admin/ (स्लैश समाप्त करने के साथ) लेकिन इसके बिना नहीं। क्या आप दोनों मामलों को काम करने के लिए बदल सकते हैं? साभार
केल्विन

@ केल्विन: प्रत्यावर्तन ($|/)दोनों मामलों को संभालना चाहिए।
गुम्बो

क्या यह बेहतर नहीं है कि हम रेवेरिट का उपयोग करें।
rineez

7
@rineez RewriteCondको हमेशा एक आवश्यकता होती है RewriteRuleकि वह इससे जुड़ी हो। और इस स्थिति RewriteCondको हर RewriteRuleकिसी के लिए एक नकारात्मक के रूप में जोड़ना काफी भारी हो सकता है, एक RewriteRuleऐसे से बाहर निकलने के रूप में एकल जिसे इस तरह के मामले में अनदेखा किया जाना चाहिए और अधिक सुरुचिपूर्ण है।
गंबू 3

3
@Eggec इसका मतलब है "कुछ भी मत बदलो"।
गम्बू जूल

112

आप जो भी कर सकते हैं, वह एक .htaccess फ़ाइल युक्त है

RewriteEngine Off

उन फ़ोल्डरों में जिन्हें आप फिर से लिखे जाने से रोकना चाहते हैं (नियमों के अनुसार एक .htaccess फ़ाइल जो कि ट्री में अधिक होती है)। सामान्य लेकिन प्रभावी।


18
+1 ~ .htaccess पदानुक्रमिक रूप से संचालित होता है, इसलिए स्थानीय फ़ोल्डर अपने माता-पिता को ओवरराइड करते हैं, जैसे CSS या MVC में एक सामान्य कैस्केड।
अटारी

4
आपके दिमाग में केवल एक ही चीज होनी चाहिए: सक्रिय करना .htaccess फाइलें ( Apache config की AllowOverrideतुलना Noneमें किसी और चीज के लिए सेटिंग ) Apache को हर अनुरोध पर .htaccess की खोज करने के लिए मजबूर करती है। इसलिए यदि आपके पास एक उच्च आवृत्ति वाली वेबसाइट / वेबसर्वर है जो कि फाइल सिस्टम / हार्डडिस्क एक्सेस पर एक शानदार प्रदर्शन प्रभाव डाल सकता है ...
bohrsty

फ़ाइल विधि के माध्यम से एसएसएल प्रमाणपत्रों के नवीकरण को मान्य करने के लिए सही सलाह। अस्थायी निर्देशिकाओं, या vhost फ़ाइल के बाहर कुछ भी संशोधित करने की आवश्यकता नहीं है। एक बार सत्यापन पूरा हो जाने के बाद, आप बस पूरा फ़ोल्डर हटा सकते हैं और आपका काम पूरा हो जाएगा। सिर्फ महान।
Countzero

25

व्यवस्थापक निर्देशिका के लिए जाँच करने के लिए एक शर्त जोड़ें, कुछ इस तरह:

RewriteCond %{REQUEST_URI} !^/?(admin|user)/
RewriteRule ^([^/] )/([^/] )\.html$ index.php?lang=$1&mod=$2 [L]

RewriteCond %{REQUEST_URI} !^/?(admin|user)/
RewriteRule ^([^/] )/$ index.php?lang=$1&mod=home [L]

हेलो रॉब, मैंने इस लाइन को "रिवर्टबेस /" के ठीक बाद डाला, और अब मुझे "500 एरर - इंटरनल सर्वर एरर" मिल रहा है
केल्विन

@ केल्विन मैंने अपना जवाब संपादित किया, प्रत्येक नियम से पहले शर्त जोड़ें कि आप इसे लागू करना चाहते हैं।
रोब

यह केवल एक ही था जिसने वास्तव में मेरी मदद की। स्वीकार किए जाते हैं जवाब था नहीं मेरी मदद।
उवे कीम

5

यदि आप नियम से एक विशेष निर्देशिका को निकालना चाहते हैं (मतलब, आप निर्देशिका फू को हटाना चाहते हैं ), आप उपयोग कर सकते हैं:

RewriteEngine on

RewriteCond %{REQUEST_URI} !^/foo/$
RewriteRule !index\.php$ /index.php [L]

ऊपर दिए गए पुनर्लेखनों में /index.php / foo / के लिए अनुरोधों को छोड़कर सभी अनुरोधों को फिर से लिखा जाएगा ।

सभी मौजूदा निर्देशों को बाहर करने के लिए, आपको अपने नियम से ऊपर की शर्त का उपयोग करना होगा:

RewriteCond %{REQUEST_FILENAME} !-d

निम्नलिखित नियम

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule !index\.php$ /index.php [L]

सब कुछ (निर्देश को छोड़कर) /index.php पर लिखता है ।


5

हमने निम्नलिखित mod_rewrite नियम का उपयोग किया:

RewriteEngine on
RewriteCond %{REQUEST_URI} !^/test/
RewriteCond %{REQUEST_URI} !^/my-folder/
RewriteRule (.*) http://www.newdomain.com/$1 [R=301,L]

यह रीडायरेक्ट करता है (स्थायी रूप से 301 रीडायरेक्ट के साथ) साइट पर सभी ट्रैफ़िक को http://www.newdomain.com , सिवाय / परीक्षण और / मेरे-फ़ोल्डर निर्देशिका में संसाधनों के अनुरोध के। हम उपयोगकर्ता को (। *) कैप्चर समूह का उपयोग करके और फिर नए URL में $ 1 सहित अनुरोध किए गए सटीक संसाधन में स्थानांतरित करते हैं। रिक्त स्थान का ध्यान रखें।


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