2010-03-08 11 views
24

Estoy tratando de implementar un sitio generado con Jekyll y me gustaría mantener el sitio en su propia subcarpeta en mi servidor para mantener todo más organizado.Use un subdirectorio como raíz con htaccess en Apache 1.3

Básicamente, me gustaría utilizar el contenido de /jekyll como la raíz a menos que exista un archivo con un nombre similar en la raíz web real. Entonces algo como /jekyll/sample-page/ se mostraría como http://www.example.com/sample-page/, mientras que algo como /other-folder/ se mostraría como http://www.example.com/other-folder.

Mi servidor de prueba se ejecuta Apache 2.2 y la siguiente .htaccess (adaptado de http://gist.github.com/97822) funciona a la perfección:

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 

Sin embargo, mi servidor de producción se ejecuta Apache 1.3, que no permite DirectorySlash. Si lo desactivo, el servidor da un error de 500 debido a una sobrecarga de redirección interna.

Si comento hacia fuera la última sección de ReWriteConds y reglas:

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

... todo funciona sobre todo: http://www.example.com/sample-page/ muestra el contenido correcto. Sin embargo, si omito la barra final, la dirección URL en la barra de direcciones expone la verdadera estructura de la URL interna: http://www.example.com/jekyll/sample-page/

¿Cuál es la mejor manera de dar cuenta de barras oblicuas del directorio en Apache 1.3, donde no existen herramientas útiles, como DirectorySlash ? ¿Cómo puedo usar el directorio /jekyll/ como raíz del sitio sin revelar la estructura de URL real?

Editar:

Después de una tonelada de investigación en Apache 1.3, he encontrado que este problema es esencialmente una combinación de dos cuestiones diferentes que figuran en el Apache 1.3 URL Rewriting Guide.

Tengo un (parcialmente) movido DocumentRoot, que en teoría se podría hacer cargo de algo como esto:

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

También tengo la infame "Problema barra final", que se resuelve mediante el establecimiento de la RewriteBase (como se sugirió en una de las respuestas a continuación):

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

el problema es la combinación de los dos. Mover la raíz del documento no hace (? No puede) usar RewriteBase -Fijación barra final cuando así lo requiera ... Hmm ...

+0

esto es increíble. Si tengo varios dominios apuntando a un servidor, ¿hay alguna manera de aplicar las reglas anteriores de manera condicional? por lo tanto, si se solicita desde domainA.com luego expone/domainA/subfolder como si fuera root ... y si lo solicita desde domainB.com, ¿entonces expone subdir/domainB/como si fuera la raíz? – bkwdesign

+0

@bkwdesign use nginx, es mucho más simple para este tipo de redirección. –

Respuesta

47

Finalmente lo conseguí, después de una semana de intentos. RewriteRules realmente son vudú ...

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] 

No hay necesidad de DirectorySlash. Magicamente todo funciona.

+0

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

10

puede simplemente usar (?):

RewriteBase /jekyll 

Y todo comienza desde ese punto.

+0

¡Esta respuesta es mejor! – maxtorzito

+0

Éste no funciona para mí en mi hosting, la respuesta anterior sí lo hace. – Ray1618

Cuestiones relacionadas