Utilizzare una sottodirectory come root htaccess in Apache 1.3
-
18-09-2019 - |
Domanda
Sto cercando di distribuire un sito generato con Jekyll e vorrei mantenere il sito nella propria sottocartella sul mio server per tenere tutto più organizzato.
In sostanza, mi piacerebbe utilizzare i contenuti del /jekyll
come la radice a meno che non esista un file dal nome simile nella radice web attuale. Quindi, qualcosa di simile a /jekyll/sample-page/
avrebbe mostrato come http://www.example.com/sample-page/, mentre qualcosa come /other-folder/
visualizzerebbe come http://www.example.com/other-folder.
Il mio server di test viene eseguito Apache 2.2 e il seguente .htaccess
(adattato da http://gist.github.com/97822 ) funziona perfettamente:
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
Tuttavia, il mio server di produzione viene eseguito Apache 1.3, che non consente DirectorySlash
. Se rendo invalido, il server dà un errore 500 a causa del sovraccarico di reindirizzamento interno.
Se io commento l'ultima sezione del ReWriteConds e regole:
RewriteCond %{REQUEST_FILENAME} -d
RewriteCond %{REQUEST_FILENAME} !/$
RewriteRule ^(.*)$ $1/
... tutto funziona per lo più: http://www.example.com/sample-page/ visualizza il contenuto corretto. Tuttavia, se tralascio la barra finale, l'URL nella barra degli indirizzi espone la struttura reale URL interno: http://www.example.com/jekyll/sample-page/
Qual è il modo migliore per tenere conto di directory barre in Apache 1.3, in cui strumenti utili come DirectorySlash
non esistono? Come posso utilizzare la directory /jekyll/
come il principale del sito senza rivelare la struttura URL effettivo?
Modifica
Dopo un sacco di ricerche in Apache 1.3, ho trovato che questo problema è essenzialmente una combinazione di due diversi problemi elencati al Apache 1.3 URL Rewriting Guida .
ho una (parziale) si è trasferito DocumentRoot, che in teoria sarebbe stato curato con qualcosa di simile:
RewriteRule ^/$ /e/www/ [R]
Ho anche il famigerato "Trailing problema Slash", che viene risolto impostando il RewriteBase
(come è stato suggerito in una delle risposte di seguito):
RewriteBase /~quux/
RewriteRule ^foo$ foo/ [R]
Il problema è che unisce i due. Spostare la radice documento non (non può?) Usa RewriteBase
truccate slash richiede (?) Che ... Hmm ...
Soluzione
Infine ha ottenuto, dopo una settimana di tentativi. RewriteRules sono davvero 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]
Non c'è bisogno di DirectorySlash
. Magicamente tutte le opere.
Altri suggerimenti
È possibile utilizzare semplicemente:
RewriteBase /jekyll
E tutto parte da quel punto.
L'unica soluzione semplice ha funzionato per me è qui
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]
Inserire il codice nel file .htaccess.