Подтвердить что ты не робот

Используйте подкаталог в качестве root с htaccess в Apache 1.3

Я пытаюсь развернуть сайт, созданный с помощью 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?

Edit:

После тонны исследований в Apache 1.3 я обнаружил, что эта проблема представляет собой комбинацию двух разных проблем, перечисленных в Руководство по перезаписи URL-адресов Apache 1.3.

У меня есть (частично) перемещенный DocumentRoot, который теоретически позаботится о чем-то вроде этого:

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

У меня также есть печально известная "проблема трейлинг-слэш", которая решается установкой RewriteBase (как было предложено в одном из ответов ниже):

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

Проблема состоит в том, чтобы объединить два. Перемещение корня документа не используется (не может?) Использовать RewriteBase -fixing trailing slashes требует (?) It... Hmm...

4b9b3361

Ответ 1

Наконец-то получил, после недели попытки. 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. Волшебно все работает.

Ответ 2

Вы можете просто использовать:

RewriteBase   /jekyll

И все начинается с этой точки.

Ответ 3

Единственное простое решение, сработавшее для меня, это здесь

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.