mod_rewrite: ID parameter durch uri ersetzen.

M.E.

Lt. Commander
Registriert
Jan. 2007
Beiträge
1.923
Hallo zusammen,

Ich steh vor folgender Aufgabenstellung:
Ein PHP Script index.php erwartet eine Seiten id als Parameter
Code:
..../index.php?pid=17

In der Sql Datenbank sind die Seiten abgelegt und werden mittels der ID geladen. In der Datenbank befindet sich auch eine Spalte mit einem eindeutigen Seitennamen. z.B. "suche"

Ich möchte jetzt in meiner .htaccess eine Regel haben, die folgende Ersetzung vornimmt:
Code:
..../index.php?pid=17 ==> .../suche.php

Ich habe schon mit Stackoverflow folgendes herausgefunden:
http://stackoverflow.com/questions/4299876/apache-mod-rewrite-using-database-to-update-rewrite-rules

Code:
RewriteRule ^(.*)$ scripts/helper/idToUri.php?pid=$1 [QSA,L]
Diese Regel muesste laut Stackoverflow schon alles richtig tun.
Das idToUri.php Script existiert und liefert beim direkten Aufruf im Browser auch die richtigen Ergebnisse.
Wenn ich die Regel in meine .htaccess einbaue, erhalte ich allerdings nur noch einen ERROR 403 - Access forbidden.

Ich weiß jetzt leider nicht, wo ich bei der Fehlersuche ansetzen soll. Ist es ein Rechte-Problem? Pfade falsch? Syntaxfehler? Oder doch das Prinzip falsch verstanden?

Das ganze läuft bei mir lokal auf einem XAMPP for Linux 5.6.15, PHP und mod_rewrite sind aktiviert.

Danke für jeden Tipp!
 
Schau doch bitte mal dir die "access.log"-Datei an. Dann siehst du worauf er genau zugreifen will.

Ich schätze er ist im falschen Ordner unterwegs.

Mach mal das [QSA] da weg! [L]
Das sorgt dafür, dass der gesamte Query drangehängt wird...
 
Zuletzt bearbeitet:
Hallo,

Danke fuer den Tipp, die Pfade scheinen zu passen.

Ich poste jetzt einfach mal meine gesamte .htaccess:

Code:
<IfModule mod_rewrite.c>
  RewriteEngine On

## Wenn ich folgende Zeile einkommentiere erhalte ich den Error 403. Wenn ich es auskommentiere, wird das Ergebnis von scripts/helper/idToUri.php?pid=xx angezeigt.
  ##RewriteBase /


###Diese Regeln interessieren und momentan nicht (ist ohnehin nur lokal)
##Ich lasse sie hier trotzdem stehen, um sicher zugehen, dass sie sich nicht mit der anderen Regel beissen.
  ## always add http://www. in front of the domains!
  RewriteCond %{HTTP_HOST} ^example\.net$ [NC]
  RewriteRule (.*) http://www.example.net/$1 [R=301,L]
  RewriteCond %{HTTP_HOST} ^example\.org$ [NC]
  RewriteRule (.*) http://www.example.org/$1 [R=301,L]

##Das hier ist die Regel, die uns interessiert.
## Siehe auch:
##http://stackoverflow.com/questions/4299876/apache-mod-rewrite-using-database-to-update-rewrite-rules
 RewriteRule ^(.*)$ scripts/helper/idToUri.php?pid=$1 [QSA,L]

</IfModule>

Ich habe mir mal die RewriteBase genauer angesehen.
Wenn ich sie auskommentiere, scheint die Regel zu funktionieren, gibt aber lediglich die Ausgabe von scripts/helper/idToUri.php?pid=xx zurueck. In diesem Script steht am ende ein echo, dass den Namen ausgibt. Dieser wird mir angezeigt anstelle des Seiteninhalts.
Muss man das irgendwie anders machen?

Ich glaube ich habe da vom Prinzip her was falsch verstanden, ich moechte ja, dass er mir die URL umschreibt und nicht den Inhalt der Seite.

Danke,
MfG
 
Dein Script idToUri.php sollte mit einem redirect auf die richtige URL antworten. Mit der id allein, kann der Apache nichts anfangen, als sie an den Client durchzureichen.

Eine Alternative wären noch Apache RewriteMaps. Damit würdest du das Mapping entweder als txt-file pflegen oder, wie ich soeben las, kann der Apache auch DB-Querys machen und sie dafür benutzen. Dann würde dein Script wegfallen.
 
Hallo,

Danke fuer den Tipp. Ich habe jetzt eine Umleitung eingebaut.

PHP:
header( 'Location: '.$db->getPageUriById($pid).'.php' ) ;

Allerdings erhalte ich jetzt die Meldung im Browser:

Fehler: Umleitungsfehler

Die aufgerufene Website leitet die Anfrage so um, dass sie nie beendet werden kann.

Die URL in der Browserzeile wird immer durch .../error-404.php ersetzt. Irgendwie scheint die ID nicht richtig uebergeben zu werden, sie ist immer -1 und das fuehrt bei mir automatisch zu error-404. Das mein Script ($db->getPageUriById($pid)) funktioniert, weiss ich sicher, da ich es auch an anderen Stellen verwende.

Muss ich jetzt die Regel
Code:
 RewriteRule ^(.*)$ scripts/helper/idToUri.php?pid=$1 [L]
noch mal anpassen?

Die $pid hole ich mir mit folgendem Script:
PHP:
function detectPageId() {
    if (isset($_GET['pid'])) {
        $pid = $_GET['pid'];
        if (is_numeric($pid)) {
            return $pid;
        } else {
            return -1; //should result in an Error 404
        }
    } else {
        return 1; // 1 is index page
    }
}
Hier sieht man auch, warum immer -1 zurueckgegeben wird. Offenbar wird in der RewriteRule der Parameter pid nicht richtig uebergeben. Was mache ich da falsch?
Wenn ich manuell eine 1 hinschreibe, leitet er wie zu erwarten auf index.php um, aber ich erhalte trotzdem den Fehler mit der Anfrageumleitung, die nie endet.

Danke,
MfG
 
Zuletzt bearbeitet:
Wenn ich dich richtig verstanden habe, rufst du initial die URL
Code:
/index.php?pid=17
auf. Dann matchst du mit
Code:
^(.*)$
alles, nicht nur query parameter und dann dürfte die finale URL ungefähr so aussehen nach dem rewrite
Code:
scripts/helper/idToUri.php?pid=/index.php?pid=17
Sowas kann man ganz gut debuggen, indem man rewrite logs aktiviert. Dann siehst du genau, wie er die URL verwurstet und kannst deinen Ausdruck anpassen.
 
Hallo,

Es ist mir jetzt endlich gelungen, das so umzusetzen, wie ich es haben wollte.
Es war eigentlich nur ein Problem, weil ich etwas grundlegende missverstanden habe.

Falls jemand ueber diese Frage stolpert, zeige ich hier meine Loesung:
.htaccess
Code:
    RewriteRule ^([^/\.]+)/?$ index.php?pid=$1 [QSA,L]

Ich erwarte nun als pid die uri, also den namen der Seite, der auch unique ist.

Jetzt wird
umgeleitet. Wohlgemerkt - und hier war mein Denkfehler - ohne, dass die URL dann wie die Umleitung aussieht. Im Browser bleibt es so stehen: www.example.com/beispiel

Danke fuer eure Hilfe!
 
Zurück
Oben