Используйте подкаталог как root с htaccess в Apache 1.3
-
18-09-2019 - |
Вопрос
Я пытаюсь развернуть сайт, созданный с помощью 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 я обнаружил, что эта проблема, по сути, представляет собой комбинацию двух разных проблем, перечисленных на Руководство по переписыванию URL-адресов Apache 1.3.
У меня есть (частично) перемещенный DocumentRoot, о котором теоретически можно было бы позаботиться с помощью чего-то вроде этого:
RewriteRule ^/$ /e/www/ [R]
У меня также есть печально известная "Проблема с косой чертой в конце", которая решается установкой RewriteBase
(как было предложено в одном из приведенных ниже ответов):
RewriteBase /~quux/
RewriteRule ^foo$ foo/ [R]
Проблема заключается в объединении этих двух факторов.Перемещение корневого каталога документа не приводит (не может?) использовать RewriteBase
—исправление завершающих косых черт требует (?) этого… Хм…
Решение
Наконец-то получилось, после недели попыток.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
.Волшебным образом все это работает.
Другие советы
Вы можете просто использовать:
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.