Pergunta

Eu estou tentando implantar um site gerado com Jekyll e gostaria de manter o site em sua própria subpasta no meu servidor para manter tudo mais organizado.

Essencialmente, eu gostaria de usar o conteúdo de /jekyll como a raiz, a menos que um arquivo de nome semelhante existe na raiz web real. Então, algo como /jekyll/sample-page/ iria mostrar como http://www.example.com/sample-page/, enquanto algo como /other-folder/ iria mostrar como http://www.example.com/other-folder.

O meu servidor de teste é executado Apache 2.2 e os seguintes .htaccess (adaptado de http://gist.github.com/97822 ) funciona perfeitamente:

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

No entanto, o meu servidor de produção é executado Apache 1.3, que não permite DirectorySlash. Se eu desativá-lo, o servidor dá um erro 500 por causa da sobrecarga de redirecionamento interno.

Se eu comente a última seção do ReWriteConds e regras:

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

... tudo em sua maioria funciona: http://www.example.com/sample-page/ exibe o conteúdo correto. No entanto, se eu omitir a barra final, o URL na barra de endereços expõe a real estrutura URL interna: http://www.example.com/jekyll/sample-page/

O que é a melhor maneira de conta para barras de diretório em Apache 1.3, onde útil ferramentas como DirectorySlash não existem? Como posso usar o diretório /jekyll/ como a raiz do site sem revelar a estrutura de URL real?

Editar:

Depois de uma tonelada de investigação em Apache 1.3, que eu achei que este problema é essencialmente uma combinação de duas questões diferentes listados no Apache 1.3 URL Guia Rewriting .

Eu tenho um (parcialmente) mudou DocumentRoot, que em teoria seria tomado cuidado com algo como isto:

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

Eu também tenho o infame "Trailing barra Problema", que é resolvido, definindo o RewriteBase (como foi sugerido em uma das respostas abaixo):

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

O problema é combinar os dois. Movendo-se a raiz do documento não (não pode?) Uso RewriteBase de fixação barra ao final exige (?) Que ... Hmm ...

Foi útil?

Solução

Finalmente consegui, depois de uma semana de tentativas. RewriteRules realmente são voodoo ...

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]

Não há necessidade de DirectorySlash. Magicamente todas as obras.

Outras dicas

Você pode simplesmente usar:

RewriteBase   /jekyll

e tudo começa a partir desse ponto.

A única solução simples funcionou para mim é aqui

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]

Coloque este código em seu arquivo .htaccess.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top