2010-03-08 15 views
24

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

अनिवार्य रूप से, मैं रूट के रूप में /jekyll की सामग्री का उपयोग करना चाहता हूं जब तक कि समान रूप से नामित फ़ाइल वास्तविक वेब रूट में मौजूद न हो। तो /jekyll/sample-page/ जैसे कुछ http://www.example.com/sample-page/ के रूप में दिखाए जाएंगे, जबकि /other-folder/ जैसे कुछ http://www.example.com/other-folder के रूप में प्रदर्शित होंगे।

मेरे परीक्षण सर्वर चलाता अपाचे 2.2 और निम्नलिखित .htaccess (http://gist.github.com/97822 से रूपांतरित) दोषरहित काम करता है:

RewriteEngine On 

# Map http://www.example.com to /jekyll. 
RewriteRule ^$ /jekyll/ [L] 

# Map http://www.example.com/x to /jekyll/x unless there is a x in the web root. 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_URI} !^/jekyll/ 
RewriteRule ^(.*)$ /jekyll/$1 

# Add trailing slash to directories without them so DirectoryIndex works. 
# This does not expose the internal URL. 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteCond %{REQUEST_FILENAME} !/$ 
RewriteRule ^(.*)$ $1/ 

# Disable auto-adding slashes to directories without them, since this happens 
# after mod_rewrite and exposes the rewritten internal URL, e.g. turning 
# http://www.example.com/about into http://www.example.com/jekyll/about. 
DirectorySlash off 

लेकिन, मेरा उत्पादन सर्वर अपाचे 1.3 है, जो DirectorySlash की अनुमति नहीं है चलाता है। अगर मैं इसे अक्षम करता हूं, तो आंतरिक रीडायरेक्ट अधिभार के कारण सर्वर 500 त्रुटि देता है।

अगर मैं ReWriteConds और नियमों का अंतिम अनुभाग बाहर टिप्पणी:

RewriteCond %{REQUEST_FILENAME} -d 
RewriteCond %{REQUEST_FILENAME} !/$ 
RewriteRule ^(.*)$ $1/ 

... सब कुछ ज्यादातर काम करता है: http://www.example.com/sample-page/ प्रदर्शित करता है सही सामग्री। हालांकि, अगर मैं पीछे की ओर स्लैश छोड़ देता हूं, तो पता बार में यूआरएल वास्तविक आंतरिक यूआरएल संरचना का खुलासा करता है: http://www.example.com/jekyll/sample-page/

अपाचे 1.3 में निर्देशिका स्लैश के लिए खाते का सबसे अच्छा तरीका क्या है, जहां DirectorySlash जैसे उपयोगी उपकरण मौजूद नहीं हैं ? मैं वास्तविक URL संरचना को प्रकट किए बिना साइट रूट के रूप में /jekyll/ निर्देशिका का उपयोग कैसे कर सकता हूं?

संपादित करें:

अपाचे 1.3 में अनुसंधान के एक टन के बाद, मैं पाया है कि इस समस्या को अनिवार्य रूप से Apache 1.3 URL Rewriting Guide में सूचीबद्ध दो अलग अलग मुद्दों का एक संयोजन है।

मैं है एक (आंशिक रूप से) DocumentRoot है, जो सिद्धांत में कुछ इस तरह के साथ का ध्यान रखा जाना होगा चले गए:

RewriteRule ^/$ /e/www/ [R] 

मैं भी कुख्यात "स्लैश समस्या," जो सेट करके किया जाता है RewriteBase (नीचे के रूप में प्रतिक्रियाओं में से एक में सुझाव दिया गया था):

RewriteBase /~quux/ 
RewriteRule ^foo$ foo/ [R] 

समस्या दो के संयोजन है। दस्तावेज़ जड़ चलती नहीं है RewriteBase -fixing अनुगामी स्लैश का उपयोग करें (? नहीं कर सकते हैं) की आवश्यकता है यह ... हम्म ...

+0

यह शानदार है। यदि मेरे पास सर्वर पर इंगित करने वाले एकाधिक डोमेन हैं, तो क्या कोई तरीका है कि मैं उपरोक्त नियमों को सशर्त तरीके से लागू कर सकता हूं? इस प्रकार, यदि डोमेन ए से अनुरोध है।कॉम फिर/डोमेन ए/उपफोल्डर का खुलासा करें जैसे कि यह रूट था .. और यदि डोमेन बी.टी. से अनुरोध है, तो subdir/domainB/जैसे कि यह रूट था? – bkwdesign

+0

@bkwdesign nginx का उपयोग करें, इस तरह के पुनर्निर्देशन के लिए यह बहुत आसान है। –

उत्तर

47

अंत में कोशिश करने के एक सप्ताह बाद, इसे मिला। RewriteRules वास्तव में वूडू रहे हैं ...

RewriteEngine On 

# Map http://www.example.com to /jekyll. 
RewriteRule ^$ /jekyll/ [L] 

# Map http://www.example.com/x to /jekyll/x unless there is a x in the web root. 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_URI} !^/jekyll/ 
RewriteRule ^(.*)$ /jekyll/$1 

# Add trailing slash to directories within jekyll 
# This does not expose the internal URL. 
RewriteCond %{SCRIPT_FILENAME} -d 
RewriteRule ^jekyll/(.*[^/])$ http://www.example.com/$1/ [R=301] 

DirectorySlash के लिए कोई ज़रूरत नहीं। यह जादूगर सभी काम करता है।

+0

http://stackoverflow.com/a/9413539/3017716 – Ken

10

आप बस का उपयोग कर सकते (?):

RewriteBase /jekyll 

और सब कुछ है कि बिंदु से शुरू होता है।

+0

यह उत्तर बेहतर है !! – maxtorzito

+0

यह मेरे होस्टिंग में मेरे लिए काम नहीं करता है, उपर्युक्त उत्तर करता है। – Ray1618