2010-03-08 7 views
24

J'essaye de déployer un site généré avec Jekyll et je voudrais garder le site dans son propre sous-dossier sur mon serveur pour que tout soit mieux organisé. Essentiellement, je voudrais utiliser le contenu de /jekyll en tant que racine à moins qu'un fichier de même nom existe dans la racine Web réelle. Donc quelque chose comme /jekyll/sample-page/ montrerait comme http://www.example.com/sample-page/, tandis que quelque chose comme /other-folder/ afficherait http://www.example.com/other-folder.Utiliser un sous-répertoire en tant que root avec htaccess dans Apache 1.3

Mon serveur de test fonctionne Apache 2.2 et les suivantes .htaccess (adapté de http://gist.github.com/97822) fonctionne parfaitement:

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 

Cependant, mon serveur de production exécute Apache 1.3, ce qui ne permet pas DirectorySlash. Si je le désactive, le serveur génère une erreur 500 à cause d'une surcharge de redirection interne.

Si je commente la dernière section de ReWriteConds et règles:

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

... tout fonctionne la plupart du temps: http://www.example.com/sample-page/ affiche le contenu approprié. Cependant, si je laisse de côté la barre oblique, l'URL dans la barre d'adresse expose la vraie structure de l'URL interne: http://www.example.com/jekyll/sample-page/

Quelle est la meilleure façon de rendre compte pour le répertoire slash dans Apache 1.3, où des outils utiles comme DirectorySlash n'existent pas ? Comment puis-je utiliser le répertoire /jekyll/ comme racine du site sans révéler la structure réelle de l'URL?

Edit:

Après une tonne de recherche sur Apache 1.3, j'ai trouvé que ce problème est essentiellement une combinaison de deux questions différentes énumérées au Apache 1.3 URL Rewriting Guide.

J'ai un (partiellement) déplacé DocumentRoot, qui en théorie devrait être pris en charge avec quelque chose comme ceci:

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

J'ai aussi le tristement célèbre « traînante problème Slash, » qui est résolu en mettant le RewriteBase (comme cela a été suggéré dans l'une des réponses ci-dessous):

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

le problème est de combiner les deux. Déplacement de la racine du document ne (? Peut pas) utiliser des barres obliques RewriteBase de fuite de fixatrices exige ... Hmm ...

+0

c'est génial. Si plusieurs domaines pointent vers un serveur, y a-t-il un moyen d'appliquer les règles ci-dessus de manière conditionnelle? ainsi, si demande de domainA.com alors exposer/domainA/sous-dossier comme si elle était la racine .. et si la demande de domainB.com, alors exposer subdir/domainB/comme si c'était la racine? – bkwdesign

+0

@bkwdesign utilise nginx, c'est beaucoup plus simple pour ce genre de redirection. –

Répondre

47

Enfin obtenu, après une semaine d'essai. RewriteRules sont vraiment 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] 

Pas besoin de DirectorySlash. Cela fonctionne comme par magie.

+0

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

10

Vous pouvez simplement utiliser (?):

RewriteBase /jekyll 

Et tout commence à partir de ce moment-là.

+0

Cette réponse est meilleure !! – maxtorzito

+0

Celui-ci ne fonctionne pas pour moi à mon hébergement, la réponse ci-dessus. – Ray1618

Questions connexes