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 ...

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top