[.htaccess] Umleitung (RewriteRule) funktioniert nicht mit umgebendem "If"

  • Sonstige

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

    [.htaccess] Umleitung (RewriteRule) funktioniert nicht mit umgebendem "If"

    Ich verzweifle gerade an folgendem Problem. Gemäß der Seite omnespro.ch/blog/post/browsers…ewrite-regeln-in-htaccess habe ich eine automatische Umleitung des Users je nach im Browser eingestellter Sprache in meiner .htaccess eingestellt. D. h. wenn er die Startseite von example.com aufruft, wird er entweder nach example.com/de/ oder example.com/en/ weitergeleitet. Die Weiterleitung an sich funktioniert, aber nicht, wenn ich folgendes If drum herum habe:

    Shell-Script

    1. <If "%{REQUEST_URI} !~ m#/\.well-known/.+#">
    2. ## Der Let's-Encrypt-Certbot darf immer und ohne Umschreibungen zugreifen
    3. #### mod_rewrite einschalten
    4. RewriteEngine On
    5. RewriteBase /
    6. #### Umleitung je nach Sprache (nur bei Zugriff auf Startseite, die immer weiterleiten soll)
    7. ## Deutsch bevorzugt
    8. RewriteCond %{HTTP:Accept-Language} ^((?!en).)*de [NC]
    9. RewriteRule ^$ /de/ [L,R=302]
    10. ## Englisch bevorzugt
    11. RewriteCond %{HTTP:Accept-Language} ^((?!de).)*en [NC]
    12. RewriteRule ^$ /en/ [L,R=302]
    13. ## Standard
    14. RewriteRule ^$ /de/ [L,R=302]
    15. </If>

    Das If an sich funktioniert aber auch. Jeder andere Code darin, z. B. Definition einer Fehlerseite oder Weiterleitung auf HTTPS, klappt. Korrekterweise wird alles übersprungen, wenn der Zugriff auf Inhalte in einem Ordner mit dem Namen ".well-known" erfolgt.

    Es gibt keine Fehlermeldung, sondern einfach nur keine Weiterleitung. Kommentiert man das If aus, geht's. Wieso? Übrigens scheint es am ^$ nach RewriteRule zu liegen (aber eben nur innerhalb des If). Denn mache ich daraus ein ^(.*)$, so wird es ausgeführt (führt aber logischerweise zu einer Endlosschleife).

    Was läuft falsch? Mit ist klar, dass in dem Fall die If-Anweisung keinen Sinn ergibt (da ich sowieso nur die Startseite abfragen will), aber es handelt sich um eine allgemeine .htaccess für noch andere Sachen.

    EDIT: Noch ein weiterer Fehler in diesem Zusammenhang (unabhängig von der Sprachauswahl): .htaccess auf example.net, RewriteRule ^(.*)$ http://example.com/$1 [QSA,R=301,L]

    Ohne If:
    example.net => example.com
    example.net/index.php?p=1 => example.com/index.php?p=1

    Mit If:
    example.net => example.com/var/www/vhosts/example.com/
    example.net/index.php?p=1 => example.com/var/www/vhosts/example.com/index.php?p=1

    Das If macht irgendwas kaputt, evtl. die Variable REQUEST_URI?
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum

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

    Ich habe die Antwort, wenn auch keine (schöne) Lösung. In der Apache-Dokumentation ist das nicht zu finden (ich konnte zumindest nichts entdecken), aber innerhalb eines If-Blocks sind bei RewriteRule die Pfade absolut, während sie normalerweise relativ sind. Das erklärt genau das Verhalten bei meinen beiden Beispielen.

    Siehe:
    stackoverflow.com/a/66360159
    serverfault.com/a/1054386
    stackoverflow.com/a/64001979

    Meine Lösung: Alles mit RewriteRule mit einer entsprechenden RewriteCond ausstatten, die den .well-known-Ordner ausschließt, der Rest mit einem If.
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum
    Tatsächlich würde ich so eine Art Routing auch eher auf den Code auslagern anstatt das in einer .htaccess zu lösen, das geht ja schon in Richtung Business Logic. In den allermeisten Fällen gibt es bei PHP Applikationen einen single Point of Entry und in der Regel gibt's da auch einen Routing Mechanismus, und das wäre denke ich der perfekte Ort für so ein Vorhaben.
    Natürlich kenne ich nicht die Umstände und Gegebenheiten des Projekts, insgesamt jedoch und falls die Möglichkeit dazu besteht, würde ich speziell solche Umleitungen eine dynamische Sprache regeln lassen.

    Btw die eigentliche Frage hätte ich auch nicht ausm Kopf beantworten können. Ich selber benutze die htaccess immer nur um alles auf eine Datei umzuleiten was nicht schon auf eine existierende Datei zeigt und um Caching und Compression zu aktivieren oder unsicheren Traffic auf HTTPS zu routen. Aber sehr gut zu wissen wenn mir sowas Mal begegnet, muchas gracias senior.

    PS: lustig wie du die meisten deiner Fragen-Posts immer schnell selber löst und beantwortest xD
    Hello World
    PHP ist in meinem Fall keine Lösung. Das obige ist nur ein kleiner Teil einer Standard-.htaccess für alle meine Seiten und Seiten von Kunden. Einige benutzen gar kein PHP, noch weniger haben eine PHP-Startseite oder -Einstiegsseite. Weiterhin enthält die .htaccess auch solche Dinge wie eine Sperrung (die man optional aktivieren kann). Und die soll auf alles greifen, Verzeichnisse und jegliche Dateitypen (außer eben im .well-known-Ordner). Da klappt es mit PHP sowieso nicht.
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum

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

    Auch wenn es Offtopic ist, ja @mumpel, es funktioniert sogar ziemlich gut ;)
    Damit brauch man sich bezüglich Sicherheitslücken, weniger* Gedanken machen :P


    *"weniger" bedeutet nicht "gar keine"
    Ich finde die Frage, wie das funktionieren soll, ehrlich gesagt, etwas seltsam. Wie hat es denn vor 1998 funktioniert, bevor PHP auf den Markt kam? ;) Die meisten meiner Internetseiten haben maximal zum Mailversand eine PHP-Datei, der Rest ist statisch. Die Website meines Arbeitgebers z. B., sehr umfangreiche Seite, sehr modern, ist ebenfalls komplett statisch. Allerdings wird in letzterem Fall lokal mit Template-Engines gearbeitet, die eine gewisse Dynamik während der Entwicklung erlauben.
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum