Der Martin: Redirect und Rewrite

Beitrag lesen

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.