webrewriter: Redirect und Rewrite

Hallo!

In meiner bestehenden .htaccess maskiere ich PHP-Dateien wie folgt:

RewriteRule (.*)_p([0-9]+).html$ /show_product.php?products_id=$2

Frage: Wie kann ich diese RewriteRule erweitern, das ein in der URL fehlendes "www" ergänzt wird?

Z.B. soll "http://testdomain.de/test_p1.html" zu "http://www.testdomain.de/test_p1.html" und "http://testdomain.com/test_p1.html" zu http://www.testdomain.com/test_p1.html umgeleitet werden, aber auch gleichzeitig "intern" die ursprüngliche RewriteRule greifen, die diese Anfrage an die PHP-Datei weiterleitet.

Mein bisheriger Versuch:

===========

RewriteCond %{HTTP_HOST} !^www..* [NC]
RewriteCond %{HTTP_HOST} !^.*..*..* [NC]

RewriteRule ^(.*) http://www.%{HTTP_HOST}/$1 [R=301]

RewriteRule (.*)_p([0-9]+).html$ /show_product.php?products_id=$2

===========

Ergebnis: "www"-Problem wird gelöst. Aber in der Browser-Adresszeile wird aus "http://testdomain.de/test_p1.html" nun leider "http://www.testdomain.de/show_product.php?products_id=1"

Wie erreiche ich, dass trotz des Redirects die Maskierung "http://www.testdomain.de/test_p1.html" stehen bleibt.

Danke für Eure Hilfe!

Tschüss,

Holger

  1. Hi,

    In meiner bestehenden .htaccess maskiere ich PHP-Dateien wie folgt:
    RewriteRule (.*)_p([0-9]+).html$ /show_product.php?products_id=$2

    du hast URLs, bei denen die Zeichen vor _p völlig egal sind? Cool ...

    Z.B. soll "http://testdomain.de/test_p1.html" zu "http://www.testdomain.de/test_p1.html" und "http://testdomain.com/test_p1.html" zu http://www.testdomain.com/test_p1.html umgeleitet werden, aber auch gleichzeitig "intern" die ursprüngliche RewriteRule greifen, die diese Anfrage an die PHP-Datei weiterleitet.

    Erstens: Bitte verwende nicht einfach erfundene Domainnamen, die wirklich existieren könnten. Für anonyme Beispiele gibt es extra reservierte Namen.

    Zweitens: Mit dem Denkansatz "gleichzeitig" bringst du dich hier in Schwierigkeiten. Du hast zwei Baustellen:

    1. example.org/*  nach www.example.org/*
      2. /*_p0000.html  nach /show_product.php?products_id=0000

    Die erste Umsetzung ergibt eine Änderung des Hostnamens, das ist nur mit einem Redirect möglich. Nur so erreichst du außerdem, dass die geänderte URL auch in der Browser-Adresszeile erscheint. Ein Redirect heißt aber automatisch: Ein zweiter, aus HTTP-Sicht unabhängiger Request.
    Die zweite Umsetzung möchtest du serverintern und "heimlich" machen.

    Damit ist klar: Du brauchst zwei Rewrite-Rules, die voneinander unabhängig sind. Betrachte die beiden Requests, die da nacheinander kommen, tatsächlich als getrennt.

    Warum du unbedingt auf den www-Hostnamen umleiten willst, ist mir allerdings schleierhaft.

    Mein bisheriger Versuch:

    RewriteCond %{HTTP_HOST} !^www..* [NC]
    RewriteCond %{HTTP_HOST} !^.*..*..* [NC]

    RewriteRule ^(.*) http://www.%{HTTP_HOST}/$1 [R=301]

    RewriteRule (.*)_p([0-9]+).html$ /show_product.php?products_id=$2

    Wenn du nach dem R-Flag auch noch ein L setzt, könnte es so laufen, wie du dir das vorstellst - allerdings geben mir deine beiden RewriteConds Rätsel auf. Was zum Geier machst du da?

    Ciao,
     Martin

    --
    Finanztipp:
    Leihen Sie sich Geld von einem Pessimisten.
    Er rechnet sowieso nicht damit, dass er es zurückbekommt.
  2. 1. Redirect bei fehlenden www
    ====== htaccess code =======
    RewriteCond %{HTTP_HOST} !^www.meineDomain.de$
    RewriteRule ^(.*)$ http://www.meineDomain.de/$1 [L,R=301]
    ====== htaccess code =======

    2. saubere RewriteRule der Documente
    ====== htaccess code =======
    RewriteRule ^(.*)_p([0-9]+).html$ /show_product.php?products_id=$2 [L]
    ====== htaccess code =======

    3. die neue htaccess-Datei sieht dann z.B. wie folgt aus
    ====== htaccess code =======
    RewriteEngine on
    Options +FollowSymLinks

    RewriteCond %{HTTP_HOST} !^www.meineDomain.de$
    RewriteRule ^(.*)$ http://www.meineDomain.de/$1 [L,R=301]

    RewriteRule ^(.*)_p([0-9]+).html$ /show_product.php?products_id=$2 [L]
    ====== htaccess code =======

    4. Erklärung :)
    [L] = steht für "last" und bedeutet das nach ausführen dieser Rule keine weiteren Prüfungen stattfinden sollen
    [R=301] steht für eien 301 redirect die ist nur interessant für Sumas :)

    MFG
    Maik