Micha2: .htaccess behalten der Adresse bei Weiterleitung macht Probleme

Hi!

Ich möchte von einer Subdomain auf eine index.php mit Get-Parameter weiterleiten. Es geht um eine lokale Installation und die Subdomain steht in der hosts Datei.

Ich möchte, dass http://mysub.localhost auf http://localhost/projekt/index.php?sub=mysub
weiterleitet, in der Adresszeile aber http://mysub.localhost stehen bleibt.

Meine .htaccess sieht so aus

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^([a-z0-9]+).localhost [NC]
RewriteRule ^(.*)$ http://localhost/projekt/index.php?sub=%1 [P]

Die weiterleitung funktioniert soweit auch aber dann wird die .htaccess erneut aufgerufen und ich bekomme einen Error 500. Wie es ausschaut, leitet die RewriteRule in einer Endlosschleife weiter?

Kann mir jemand sagen wo der Fehler ist?

  1. Ich möchte, dass http://mysub.localhost auf http://localhost/projekt/index.php?sub=mysub
    weiterleitet, in der Adresszeile aber http://mysub.localhost stehen bleibt.

    RewriteRule ^(.*)$ http://localhost/projekt/index.php?sub=%1 [P]
    Kann mir jemand sagen wo der Fehler ist?

    Ja. Das 'http' in der Adresse ist falsch. Damit wird zwingend ein neuer Request ausgelöst.

    Etwas wie:

    RewriteRule ^(.*)$ /srv/www/htdocs/projekt/index.php?sub=%1 [L]  
    
    

    (Pfad im lokalen Dateisystem des Servers) wäre wohl günstiger.

    Jörg Reinholz

    1. Etwas wie:

      RewriteRule ^(.*)$ /srv/www/htdocs/projekt/index.php?sub=%1 [L]

      
      > (Pfad im lokalen Dateisystem des Servers) wäre wohl günstiger.  
        
      Das wäre unter meiner lokalen Xampp-Installation dann C:/xampp/htdocs/projekt/index.php?sub=%1 oder /htdocs/projekt/index.php?sub=%1?  
        
      Mit C:/xampp bekomme ich einen Error 404 und ohne bekomme ich einen Internal Server Error und den Hinweis "Additionally, a 500 Internal Server Error error was encountered while trying to use an ErrorDocument to handle the request."
      
      1. Mit C:/xampp bekomme ich einen Error 404

        Sorry, es ist ein 403 - Zugriff verweigert.

  2. Auf stackoverflow habe ich einen Hinweis gefunden der halbwegs funktioniert.

    RewriteEngine On
    RewriteCond %{HTTP_HOST} ^([a-z0-9]+).localhost [NC]
    RewriteRule ^projekt/- [L]
    RewriteRule (.*) projekt/index.php?sub=%1 [L]

    Ich werde auch richtig auf die Datei weiter geleitet. Wenn ich die GET-Variablen ausgebe, ist "sub" aber leer.
    Ich kann anscheinend auch nicht mehr auf andere Dateien zugreifen. Ich habe eine Text-Datei unter "projekt/test.txt" angelegt aber ich kann sie weder über localhost/projekt/test.txt, noch über mysub.localhost/test.txt oder mysub.localhost/projekt/test.txt aufrufen.
    Es wird immer auf die localhost/index.php geleitet und die Ausgabe des leeren GET-Parameters angezeigt.

    1. Es wird immer auf die localhost/index.php geleitet und die Ausgabe des leeren GET-Parameters angezeigt.

      Ursache:

      RewriteRule (.*) projekt/index.php?sub=%1 [L]

      Soweit ich das weiß:
      RewriteRule (.*) projekt/index.php?sub=$1

      Jörg Reinholz

      1. Hi Jörg Reinholz!

        Soweit ich das weiß:
        RewriteRule (.*) projekt/index.php?sub=$1

        Das ändert leider nichts. $_GET['sub'] ist dann immernoch leer. Was bedeuten eigentlich das [L] oder das [P] das ich vorher dort stehen hatte?

        1. Moin!

          Was bedeuten eigentlich das [L] oder das [P] das ich vorher dort stehen hatte?

          Das P steht für "proxy" und ist hier wohl nicht zielführend, weil auch da einen neuen Request (Diesmal des Apache als Proxy) bewirkt. Das L steht für "last" - das bedeutet, wenn die Regel zutrifft werden nach dieser Regel keine weiteren mehr beachtet. Das kann und wird (hier!) wohl sinnvoll sein.

          Das ändert leider nichts. $_GET['sub'] ist dann immernoch leer.

          Hm. versuche mal:
          RewriteRule ^/(.*)$ projekt/index.php?sub=$1 [L]

          Das eingefügte "^/"  symbolisiert den Beginn des Strings und den an dieser Stelle führenden Slash.
          Das nach der Klammer eingefügte "$"  symbolisiert das Ende des Strings.
          (.*) "matcht" dann auf alles dazwischen.

          Fundstelle wie oben. Hinweis. mod rewrite des 2.4er Apache kann ggf. mehr, ist aber noch nicht überall verfügbar.

          Jörg Reinholz

          1. Tach!

            Das L steht für "last"] - das bedeutet, wenn die Regel zutrifft werden nach dieser Regel keine weiteren mehr beachtet. Das kann und wird (hier!) wohl sinnvoll sein.

            Mit der Einschränkung, dass das nur für die restlichen Direktiven in dieser Konfigurationsdatei und (wichtig!) den aktuellen Durchlauf gilt. Nach einem erfolgreichen Rewriten wird der umgeschriebene Request intern erneut durch den Apachen geschickt. Der (neue) Request kommt unter Umständen wieder in diesem Verzeichnis und damit derselben Konfigurationsdatei vorbei und durchläuft die Regel(n) ein weiteres Mal. Man begegnet diesem Verhalten, indem man real existierende Dateien und Verzeichnisse von den Regeln ausschließt. Üblicherweise zeigt ja der vormalige Request nach einer virtuellen Resource nun auf ein konkretes Dokument.

            RewriteCond %{REQUEST_FILENAME} !-f
            RewriteCond %{REQUEST_FILENAME} !-d
            RewriteRule ...

            dedlfix.