.htaccess: Weiterleitung auf www und SSL (https) erzwingen klappt nicht bei Unterverzeichnis

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von Marcus Gräfe.

    .htaccess: Weiterleitung auf www und SSL (https) erzwingen klappt nicht bei Unterverzeichnis

    Ich möchte die Domain example.com (Beispiel) immer auf https://www.example.com weiterleiten. Dazu habe ich folgende htaccess-Datei angelegt:

    Quellcode

    1. # mod_rewrite aktivieren
    2. RewriteEngine on
    3. RewriteBase /
    4. # www-Präfix und SSL erzwingen
    5. RewriteCond %{HTTP_HOST} ^example\.com$ [NC,OR]
    6. RewriteCond %{HTTPS} off
    7. RewriteRule ^(.*)$ https://www.example.com/$1 [L,R=301,NC]

    Weiterhin liegt im Rootverzeichnis der Domain folgende PHP-Datei (index.php):

    PHP-Quellcode

    1. <?php
    2. header('Location: /cms/', true, 301);
    3. ?>

    Im Unterverzeichnis cms liegt die eigentliche Website.

    Nun habe ich verschiedene Aufrufe versucht:

    Quellcode

    1. example.com => leitet korrekt um
    2. www.example.com => leitet korrekt um
    3. https://example.com => leitet korrekt um
    4. https://www.example.com => leitet korrekt um (bzw. es ändert sich nichts)
    5. example.com/cms/kategorie/3d-animation => Es fehlt www! (SSL klappt aber)
    6. www.example.com/cms/kategorie/3d-animation => leitet korrekt um
    7. https://example.com/cms/kategorie/3d-animation => Es fehlt www!
    8. https://www.example.com/cms/kategorie/3d-animation => leitet korrekt um (bzw. es ändert sich nichts)

    Also bei den zwei Aufrufen des Unterverzeichnisses ohne www wird kein www hinzugefügt (nur https). Was mache ich falsch?

    Webserver ist ein Apache.
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Wenn die .htaccess nur im "docroot" liegt kann die doch gar nicht für Unterverzeichnisse funktionieren?
    M.M.n. sind die Verzeichnis bezogen - heißt gültig für den Ordner in dem sie liegt, oder hab ich da was falsch verstanden?

    Unabhängig davon, lass dich beim Testen nicht vom Browser veräppeln, die haben so was wie ein "redirect cache" - der hat mich schon viele Stunden gekostet und am Ende war meine erste/zweite redirect Regel passend nur der Browser hatte noch eine andere im Cache.
    Wäre mir neu, dass eine .htaccess im Root-Verzeichnis nicht für Unterverzeichnisse gilt. Wenn ich z. B. den Zugriff auf Root-Ebene blocke (deny from all), so komme ich doch auch nicht in Unterverzeichnisse rein. Sonst müsste ich ja jedes Verzeichnis einzeln blocken.

    Außerdem funktioniert ja die Weiterleitung auf https. Somit kann deine Theorie nicht stimmen.

    Außer dass mit dem Cache. Allerdings würde mich das wundern. Ich habe sämtliche Browserdaten zwischendurch gelöscht und auch ein Neuladen der Seite erzwungen.
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum
    Das ist natürlich ein gutes Argument und klingt schlüssig - bin da mit der .htaccess nicht so vertraut, ich konfiguriere das direkt im vHost

    Das Neuladen der Seite erzwingen hilft leider nicht immer (zumindest im FF ist es mir aufgefallen während ich mit dem Thema gekämpft hab), ich hab dann mit curl die URLs getestet.

    Quellcode

    1. $ curl -s -D - http://domain.de -o /dev/null
    2. HTTP/1.1 302 Found
    3. Date: Tue, 05 Jan 2016 10:08:28 GMT
    4. Server: Apache
    5. Location: https://domain.de/
    6. Content-Length: 206
    7. Content-Type: text/html; charset=iso-8859-1
    Ich habe heute nochmal diverse Tests gemacht. Ich habe zum einen die zwei Anweisungen getrennt, also SSL und www werden separat behandelt und weiterhin habe ich mal die Abfragen anders rum gemacht, also statt "startet mit example.com" "startet nicht mit www.". Brachte leider alles nichts.

    Ich kann nicht verstehen, warum das https immer hinzugefügt wird, aber das www nicht. Denn in der RewriteRule steht doch www ganz klar drin.

    Die Seite ist ein CMS auf Joomla-Basis, ist da evtl. der Fehler zu suchen?
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum
    Ich denke, dann muss es an Joomla liegen und nicht an der htaccess-Datei. Ich frage mal in einem Joomla-Forum...

    Danke soweit, ich melde mich wieder, sobald ich neue Infos habe.
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum
    Mittlerweile bin ich absolut sicher, dass es an Joomla liegt. Hat also nichts mit der htaccess an sich zu tun. Im Joomla-Forum ist man aber genau so ratslos wie ich.

    Aber ich kann nun bestätigen, dass Chrome, Firefox und Internet Explorer alle einen "Redirect-Cache" haben, was ziemlich nervig ist. D. h. ein Browser ignoriert quasi die Antwort des Webservers, solange ich nicht den Cache leere (und den Browser neustarte).
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum
    Ich denke das Problem ist die htaccess-Datei in deinem cms-Verzeichnis (von Joomla).
    Allgemein gelten Regeln, die in einer htaccess-Datei definiert werden, auch für alle Unterverzeichnisse. Rewrite-Regeln allerdings nicht. Hier gewinnt AFAIK die letzte Konfigurationsdatei, die sich im Pfad befindet. Lies: alle Rewrite-Regeln die im Root-Verzeichnis spezifiziert wurden, werden nicht beachtet, wenn example.com/cms aufgerufen wird und sich im cms-Verzeichnis eine htaccess-Datei mit Rewrite-Regeln befindet.
    RewriteOptions Inherit könnte evtl. dein Problem lösen. Alternativ könntest du versuchen, deine Regeln in die htaccess-Datei von Joomla mit aufzunehmen.
    Mache ich in der .htaccess im /cms/-Verzeichnis ein RewriteOptions Inherit, so klappt es auf den ersten Blick, aber leider wird alles nach /cms/ entfernt. D. h. ein Aufruf von example.com/cms/kategorie/ ruft leider nur die Seite example.com/cms/ auf (dafür aber mit www).

    Das hier ist die htaccess von Joomla:

    Quellcode

    1. RewriteEngine On
    2. RewriteCond %{QUERY_STRING} base64_encode[^(]*\([^)]*\) [OR]
    3. RewriteCond %{QUERY_STRING} (<|%3C)([^s]*s)+cript.*(>|%3E) [NC,OR]
    4. RewriteCond %{QUERY_STRING} GLOBALS(=|\[|\%[0-9A-Z]{0,2}) [OR]
    5. RewriteCond %{QUERY_STRING} _REQUEST(=|\[|\%[0-9A-Z]{0,2})
    6. RewriteRule .* index.php [F]
    7. RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
    8. RewriteCond %{REQUEST_URI} !^/index\.php
    9. RewriteCond %{REQUEST_FILENAME} !-f
    10. RewriteCond %{REQUEST_FILENAME} !-d
    11. RewriteRule .* index.php [L]

    Mache ich meine Anweisungen dort rein, wird das /cms/ einfach entfernt, d. h. example.com/cms/kategorie/ führt dann zu example.com/kategorie/. Auch hier klappt www, aber auch hier erreiche ich nicht die gewünschte Seite (hier kommt sogar nur eine Fehlerseite, weil außerhalb von cms die angeforderte Datei nicht existiert).

    Hast du noch eine Idee?
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum

    3daycliff schrieb:

    Hast du (bei der zweiten Variante) auch "cms" mit in deiner RewriteRule aufgenommen?

    Jetzt ja (bei RewriteRule, nicht bei RewriteBase) und siehe da — es funktioniert! :)

    Vielen Dank!
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum