Verwenden, um ein Unterverzeichnis als Wurzel mit htaccess in Apache 1.3
-
18-09-2019 - |
Frage
Ich versuche, eine Website mit Jekyll erzeugt zu implementieren und möchte auf meinem Server die Website in einem eigenen Unterordner halten alles zu halten, besser organisiert.
Im Grunde möchte ich den Inhalt /jekyll
als Wurzel verwenden, wenn eine Datei in ähnlicher Weise in dem aktuellen Web-Root genannt existiert. So etwas wie /jekyll/sample-page/
würde zeigen, wie http://www.example.com/sample-page/, während so etwas wie /other-folder/
wie http://www.example.com/other-folder.
Mein Test-Server läuft Apache 2.2 und die folgende .htaccess
(angepasst von http://gist.github.com/97822 ) funktioniert einwandfrei:
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
Allerdings ist meine Produktionsserver läuft Apache 1.3, die nicht DirectorySlash
zulässt. Wenn ich es zu deaktivieren, gibt der Server einen 500-Fehler wegen interner Redirect Überlastung.
Wenn ich den letzten Abschnitt ReWriteConds Kommentar und Regeln:
RewriteCond %{REQUEST_FILENAME} -d
RewriteCond %{REQUEST_FILENAME} !/$
RewriteRule ^(.*)$ $1/
... alles meist funktioniert: http://www.example.com/sample-page/ zeigt den richtigen Inhalt. Wenn ich jedoch den abschließenden Schrägstrich, die URL in der Adressleiste macht die reale interne URL-Struktur auszulassen: http://www.example.com/jekyll/sample-page/
Was ist der beste Weg, um Konto für Verzeichnis in Apache schlitzt 1.3, wo nützliche Tools wie DirectorySlash
gibt es nicht? Wie kann ich das /jekyll/
Verzeichnis wie der Site-Stamm, ohne die tatsächliche URL-Struktur enthüllt?
Edit:
Nach einer Tonne Forschung in Apache 1.3, Ich habe festgestellt, dass dieses Problem ist im Wesentlichen eine Kombination aus zwei verschiedenen Themen aufgelistet auf dem Apache 1.3 URL-Manipulation .
Ich habe eine (teilweise) bewegt DocumentRoot, die in der Theorie Pflege mit so etwas wie dies gemacht werden würde:
RewriteRule ^/$ /e/www/ [R]
Ich habe auch das berüchtigte „Nachgestellte Slash Problem“, die durch Einstellen des RewriteBase
gelöst wird (wie in einen der Antworten unten vorgeschlagen wurde):
RewriteBase /~quux/
RewriteRule ^foo$ foo/ [R]
Das Problem der beiden ist die Kombination. Bewegen des Document-Root nicht (nicht?) Verwenden RewriteBase
Festsetzungsschrägstriche Hinter erfordert (?) Es ... Hmm ...
Lösung
Schließlich bekam es nach einer Woche zu versuchen. RewriteRules wirklich sind 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]
Keine Notwendigkeit für DirectorySlash
. Es magisch alles funktioniert.
Andere Tipps
Sie können einfach verwenden:
RewriteBase /jekyll
Und alles beginnt von diesem Punkt aus.
Die einzige einfache Lösung für mich gearbeitet wird hier
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]
Setzen Sie diesen Code in Ihre .htaccess-Datei.