Apache: .htaccess Rewrites als Alternative für DocumentRoot-Änderung

JR Cologne

Administrator
Teammitglied
Hallo zusammen,

angenommen, ich möchte eine Web-Anwendung in einem Shared-Webhosting-Paket betreiben, wo ich keine Änderung am DocumentRoot des Apache-Webservers vornehmen kann.

Wenn die Webanwendung so konstruiert ist, dass der Einstiegspunkt im Verzeichnis /public_html/public liegt, der DocumentRoot standardmäßig allerdings für das Verzeichnis /public_html konfiguriert wurde, stehe ich vor der Herausforderung, dass ich nach folgendem Prinzip mittels .htaccess URL-Rewrites erstellen müsste:

1. example.com/ müsste example.com/public ausliefern
2. in der URL dürfte nicht example.com/public, sondern example.com/ stehen
3. ein expliziter Aufruf von example.com/public müsste example.com/public ausliefern, jedoch example.com/ als URL anzeigen (keine doppelte Verfügbarkeit unter example.com/ als auch example.com/public)

Hat jemand eine Idee, wie man das mittels .htaccess Rewrites umsetzen könnte?

Mein aktueller Stand sieht folgendermaßen aus:

1. Die folgende .htaccess-Konfiguration im DocumentRoot-Verzeichnis sorgt für die Auslieferung vom public-Verzeichnis unter der Domain example.com:
/public_html/.htaccess:
RewriteEngine on
RewriteCond %{REQUEST_URI} !^public
RewriteRule ^(.*)$ public/$1 [L]

2. Dies ist die .htaccess-Konfiguration im public-Verzeichnis, welche die korrekte Auslieferung der Web-Anwendung über den Front-Controller sicherstellt:
/public_html/public/.htaccess:
DirectoryIndex index.php

<IfModule mod_negotiation.c>
    Options -MultiViews
</IfModule>

<IfModule mod_rewrite.c>
    RewriteEngine On

    RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\2$
    RewriteRule ^(.*) - [E=BASE:%1]

    # Sets the HTTP_AUTHORIZATION header removed by Apache
    RewriteCond %{HTTP:Authorization} .
    RewriteRule ^ - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

    RewriteCond %{ENV:REDIRECT_STATUS} ^$
    RewriteRule ^index\.php(?:/(.*)|$) %{ENV:BASE}/$1 [R=301,L]

    # If the requested filename exists, simply serve it.
    # We only want to let Apache serve files and not directories.
    RewriteCond %{REQUEST_FILENAME} -f
    RewriteRule ^ - [L]

    # Rewrite all other queries to the front controller.
    RewriteRule ^ %{ENV:BASE}/index.php [L]
</IfModule>

<IfModule !mod_rewrite.c>
    <IfModule mod_alias.c>
        RedirectMatch 302 ^/$ /index.php/
    </IfModule>
</IfModule>

Die aktuelle Problematik ist vor allen Dingen noch, dass die Anwendung sowohl unter example.com/public als auch unter example.com/ ausgeliefert wird. Dies würde natürlich zu einer doppelten Indexierung und Duplicate Content führen, weswegen das so nicht akzeptabel ist.

Schon mal vielen Dank im Voraus für eure Tricks und Tipps zum Umgang mit dieser Situation. Es wäre toll, wenn sich eine passende .htaccess-Konfiguration finden würde.

Viele Grüße
Jasper
 
Bei vielen Providern kann man für einzelne Domains ein DocumentRoot im Controlpanel konfigurieren. Hast du das schon mal probiert?
 
Bei welchem Provider bist du denn?

Vielleicht mal den Weg über den Support gehen, weil alles andere ist Pfusch und öffnet die Tür für mögliche Zugriffe auf Dateien, die du möglicherweise nicht ausliefern möchtest:
# If the requested filename exists, simply serve it.
# We only want to let Apache serve files and not directories.
 
Hm, ok. Wenn du sagst, dass der Umweg über Rewrites nicht funktioniert bzw. alles andere als ratsam ist, bleibt mir wohl erstmal nichts anderes üblich.

Es geht um ein Webhosting-Paket bei den Serverprofis. Dort kann man zumindest bei der Hauptdomain eigentlich nicht den DocumentRoot ändern.
Vielleicht macht der Support aber eine Ausnahme, mal sehen...

Vielen Dank schon mal!
 
Du könntest deine App auch in / installieren und in /public_html deine index.php laden (so wie du es mit dem public-Ordner machen willst). Es sei denn du hast dort keine Schreibrechte :D
 
Zurück
Oben Unten