سؤال

أحاول نشر موقع تم إنشاؤه باستخدام Jekyll ويود الحفاظ على الموقع في مجلده الفرعي الخاص به على الخادم الخاص بي للحفاظ على كل شيء أكثر تنظيما.

أساسا، أود استخدام محتويات /jekyll كجذر ما لم يتم تسمية ملف يسمى بالمثل في جذر الويب الفعلي. لذلك مثل شيء مثل /jekyll/sample-page/ سوف تظهر كما http://www.example.com/sample-page/, ، في حين شيء مثل /other-folder/ سوف يعرض كما http://www.example.com/other-folder..

يعمل خادم الاختبار الخاص بي Apache 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

ومع ذلك، يعمل خادم الإنتاج الخاص بي Apache 1.3، الذي لا يسمح DirectorySlash. وبعد إذا قمت بتعطيلها، فإن الخادم يعطي خطأ 500 بسبب التحميل الزائد للإعادة التوجيه الداخلي.

إذا أضفت القسم الأخير من ReWriteConds والقواعد:

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

... كل شيء يعمل في الغالب: http://www.example.com/sample-page/ يعرض المحتوى الصحيح. ومع ذلك، إذا حذفت القطع الخطية الزائدة، فهو عنوان URL في شريط العناوين يكشف عن هيكل URL الداخلي الحقيقي: http://www.example.com/jekyll/sample-page/

ما هي أفضل طريقة لحساب مائلة الدليل في Apache 1.3، حيث توجد أدوات مفيدة DirectorySlash لا توجد؟ كيف يمكنني استخدام /jekyll/ دليل كجذر الموقع دون الكشف عن هيكل URL الفعلي؟

يحرر:

بعد طن من البحث في Apache 1.3، لقد وجدت أن هذه المشكلة هي في الأساس مزيج من مشكلتين مختلفتين مدرجا في أباتشي 1.3 عنوان إعادة كتابة URL.

لدي (جزئيا) انتقلت المستندات، والتي من الناحية النظرية ستحته بشيء مثل هذا:

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

لدي أيضا "مشكلة القطع الخطية الزائدة"، والتي تم حلها عن طريق تحديد RewriteBase (كما اقترح في أحد الردود أدناه):

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

المشكلة الجمع بين الاثنين. نقل جذر المستند لا يستخدم (لا يمكن؟) RewriteBase-Fixing زائدة الخط يتطلب (؟) ... HMM ...

هل كانت مفيدة؟

المحلول

أخيرا حصلت عليه، بعد أسبوع من المحاولة. إعادة التباين حقا هل الفودو ...

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. وبعد ذلك بطريقة سحرية جميع الأعمال.

نصائح أخرى

يمكنك ببساطة استخدام:

RewriteBase   /jekyll

وكل شيء يبدأ من تلك النقطة.

الحل البسيط الوحيد الذي عمل لي هو هنا

RewriteEngine on
RewriteCond %{HTTP_HOST} ^domain-name.com$ [NC,OR]
RewriteCond %{HTTP_HOST} ^www.domain-name.com$
RewriteCond %{REQUEST_URI} !folder/
RewriteRule (.*) /folder/$1 [L]

ضع هذا الرمز في ملف .htaccess الخاص بك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top