2009-02-27 11 views
14

मुझे उम्मीद है कि mod_rewrite और Apache के साथ ऐसा करने का एक तरीका है, लेकिन शायद यह भी विचार करने का एक और तरीका है।केवल तभी अनुरोधों को पुनर्निर्देशित करें जब फ़ाइल नहीं मिली है?

मेरी साइट पर, मेरे पास ग्राहकों के लिए साइट के पुन: स्किन किए गए संस्करणों के लिए निर्देशिकाएं स्थापित की गई हैं। यदि वेब रूट /home/blah/www है, तो ग्राहक निर्देशिका /home/blah/www/clients/abc होगी। जब आप किसी वेब ब्राउज़र के माध्यम से क्लाइंट निर्देशिका तक पहुंचते हैं, तो मैं क्लाइंट निर्देशिका में मौजूद किसी भी अनुरोधित फ़ाइलों का उपयोग करना चाहता हूं। अन्यथा, मैं इसे वेब रूट में फ़ाइल का उपयोग करना चाहता हूं।

उदाहरण के लिए, मान लें कि क्लाइंट को अपने index.html की आवश्यकता नहीं है। इसलिए, कुछ कोड निर्धारित करेंगे कि index.html/home/blah/www/clients/abc में नहीं है और इसके बजाय /home/blah/www में से एक का उपयोग करेगा। ध्यान रखें कि मैं किसी भी समय क्लाइंट को वेब रूट पर रीडायरेक्ट नहीं करना चाहता हूं, अगर मैं क्लाइंट निर्देशिका ने अपनी प्रति निर्दिष्ट नहीं की है तो मैं बस उस रूट के साथ वेब रूट की फ़ाइल का उपयोग करना चाहता हूं। वेब ब्राउज़र को अभी भी /clients/abc पर इंगित करना चाहिए कि फ़ाइल वहां मौजूद है या रूट में है या नहीं। इसी तरह, यदि ग्राहक निर्देशिका में news.html का अनुरोध है और मौजूद है, तो बस वेब रूट के news.html की बजाय उस फ़ाइल को सेवा दें। उपयोगकर्ता का अनुभव निर्बाध होना चाहिए।

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

अपने उदाहरणों में, कृपया संकेत दें कि आपका कोड क्लाइंट निर्देशिका में .htaccess फ़ाइल में है या वेब रूट। वेब रूट को प्राथमिकता दी जाती है।

उत्तर

4

मैं कम से कम एक समस्या है लग रहा था प्रत्येक उदाहरण के साथ एक bove। %{DOCUMENT_ROOT} कुछ स्थानों में गलत चीज़ करना प्रतीत होता था, और कुछ / वर्ण अनुपलब्ध प्रतीत होते हैं। यहां मेरा समाधान है, जो वेब रूट में .htaccess में जाता है।

दो नियमों का उपयोग करने के बजाय (एक ऐसे मामले के लिए जहां क्लाइंट के अंतर्गत फ़ाइल/पाया गया है, और कोई नहीं मिला है), मुझे केवल यह जांचना होगा कि अनुरोध की गई फ़ाइल (या निर्देशिका) मौजूद नहीं है। क्योंकि यदि यह मौजूद है, तो कोई बदलाव की आवश्यकता नहीं है, यह केवल ग्राहक डीआईआर में प्रदान की गई फ़ाइल का उपयोग कर सकता है। यहां दिया गया कोड यहां दिया गया है:

RewriteEngine on 
RewriteCond %{DOCUMENT_ROOT}/clients/$1/$2 !-f 
RewriteCond %{DOCUMENT_ROOT}/clients/$1/$2 !-d 
RewriteRule ^clients/([^/]+)/(.*)$ $2 [L] 

आपकी मदद के लिए धन्यवाद!

3
RewriteCond %{REQUEST_FILENAME} !-f 
+1

जो कुछ मैं चाहता हूं उसे करने के लिए बहुत छोटा लगता है। क्या आप तर्क को थोड़ा सा समझा सकते हैं? धन्यवाद! – DivideByHero

23
# If requested resource exists as a file or directory, skip next two rules 
RewriteCond %{DOCUMENT_ROOT}/$1 -f [OR] 
RewriteCond %{DOCUMENT_ROOT}/$1 -d 
RewriteRule (.*) - [S=2] 
# 
# Requested resource does not exist, do rewrite if it exists in /archive 
RewriteCond %{DOCUMENT_ROOT}/archive/$1 -f [OR] 
RewriteCond %{DOCUMENT_ROOT}/archive/$1 -d 
RewriteRule (.*) /archive/$1 [L] 
# 
# Else rewrite requests for non-existent resources to /index.php 
RewriteRule (.*) /index.php?q=$1 [L] 

Rewrite if files do not exist

0

से इस प्रयास करें:

RewriteEngine on 
RewriteRule ^clients/abc/ - [L] 
RewriteCond %{DOCUMENT_ROOT}clients/abc/$0 -f 
RewriteRule .* clients/abc/$0 [L] 
+0

क्या यह वेब रूट में .htaccess के लिए है? – DivideByHero

+0

हां, यह दस्तावेज़ रूट निर्देशिका में .htaccess फ़ाइल के लिए है। – Gumbo

0

मुझे लगता है कि आप इन पंक्तियों के साथ कुछ चाहते हैं:

RewriteEngine on 
RewriteCond %{DOCUMENT_ROOT}clients/$1/$2 -f 
RewriteRule ^clients/([^/]+)/(.*)$ %{DOCUMENT_ROOT}clients/$1/$2 [L] 
RewriteRule ^clients/([^/]+)/(.*)$ %{DOCUMENT_ROOT}$2 [L] 
+0

अच्छा बिंदु। लेकीन मे ।htaccess फ़ाइलें पैटर्न स्लैश के साथ शुरू नहीं होना चाहिए। और यदि आप DOCUMENT_ROOT चर का उपयोग करते हैं तो यह अधिक सुविधाजनक होगा। – Gumbo

+0

क्या आप स्पष्टीकरण दे सकते हैं कि इसे DOCUMENT_ROOT के साथ कैसे अपडेट किया जाना चाहिए? यह काम नहीं करता है। – DivideByHero

+0

"% {DOCUMENT_ROOT}" द्वारा रीवाइटकॉन्ड "/ home/blah/www /" में बदलें और इसे प्रतिस्थापन में हटा दें। नियमित अभिव्यक्ति पैटर्न में अग्रणी "/" को भी हटा दें। फिर यह काम करना चाहिए। – Gumbo

9

इस बारे में कैसे?

# If requested resource exists as a file or directory go to it 
RewriteCond %{REQUEST_FILENAME} -f [OR] 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule (.*) - [L] 

# Else rewrite requests for non-existent resources to /index.php 
RewriteRule (.*) /index.php?q=$1 [L] 
संबंधित मुद्दे