Rewrite-Regel mit QUERY_STRING funktioniert nicht
Auf dem Apache-Server muss ich mydomain.com/something/?p=value in mydomain.com/something/?page=value umschreiben
Ich habe es versucht:
RewriteEngine On
RewriteCond %{QUERY_STRING} p=(.*)
RewriteRule ^(.*)/p=$ $1?page=%{QUERY_STRING} [L,QSA]
aber nicht wok, kann mir helfen?
Antworten
RewriteCond %{QUERY_STRING} p=(.*) RewriteRule ^(.*)/p=$ $1?page=%{QUERY_STRING} [L,QSA]
Hier gibt es zahlreiche "Fehler":
Das
RewriteRule
Muster , dh.^(.*)/p=$
, wird niemals übereinstimmen, dap=
es nicht als Teil des URL-Pfads auftritt (es ist Teil der Abfragezeichenfolge). DasRewriteRule
Muster stimmt nur mit dem URL-Pfad überein, wodurch insbesondere die Abfragezeichenfolge ausgeschlossen wird. Das oben Gesagte bewirkt also nichts für die angegebene Beispiel-URL.Sie verwenden die
QUERY_STRING
Servervariable anstelle des erforderlichen URL-Parametersvalue
in der Ersetzungszeichenfolge . IstQUERY_STRING
aber offensichtlich die gesamte "Abfragezeichenfolge", so würde am Ende eine fehlerhafte Abfragezeichenfolge des Formulars erstellt werden :page=p=<value>
.Die Verwendung der
QSA
Flagge Ergebnisse in der ursprünglichen Abfrage - String auf die Anforderung wird fusionierte mit der Abfrage - String Sie im verwenden Substitution String. Dies würde also&p=<value>
zum Anhängen führen, was Sie nicht benötigen. Sie möchten die vorhandene Abfragezeichenfolge ersetzen.RewriteRule ^(.*)/p=$ $1?page=
- Sie schließen den abschließenden Schrägstrich aus der Erfassungsgruppe imRewriteRule
Muster aus , sodass der abschließende Schrägstrich effektiv aus der neu geschriebenen URL entfernt wird. Dies unterscheidet sich von Ihrem Beispiel.Sie benötigen anscheinend ein internes Umschreiben (keine externe Umleitung ) und ändern "nur" den Namen eines einzelnen URL-Parameters. Dies ist etwas, das Sie normalerweise in Ihrer Anwendung lösen würden, anstatt eine URL in Apache neu zu schreiben. (?)
Versuchen Sie stattdessen Folgendes:
RewriteEngine On
# Internally "rewrite" the request
RewriteCond %{QUERY_STRING} ^p=([^&]*)$
RewriteRule (.*/)$ $1?page=%1 [L]
Dies entspricht jedem URL-Pfad, der mit einem Schrägstrich endet (gemäß Ihrem Beispiel). Die %1
Rückreferenz bezieht sich auf die erfasste Gruppe im zuletzt übereinstimmenden CondPattern , d. H. der Wert des p
URL-Parameters. Es wird angenommen, dass dies p=<value>
der einzige URL-Parameter in der Anforderung ist.
UPDATE: Es scheint nicht zu funktionieren ... wenn
localhost/list/?p=2
ich anrufe, bekomme ich einfachlocalhost/list/?p=2
Ja, die sichtbare URL ändert sich nicht, da dies ein internes "Umschreiben" ist (wie Sie in Ihrer Frage anscheinend anfordern). Die URL wird intern umgeschrieben list/?page=2
. (Es gibt auch den Punkt, der list/?page=2
nicht unbedingt ein gültiger Endpunkt ist - er erfordert ein weiteres Umschreiben, möglicherweise durch mod_dir, um eine gültige Anfrage zu bilden. ZB list/index.php?page=2
?)
Wenn Sie möchten, dass sich die URL sichtbar ändert, benötigen Sie möglicherweise doch eine externe "Weiterleitung"? Dazu müssen Sie der RewriteRule
Ersetzungszeichenfolge ein Schrägstrichpräfix hinzufügen und das Flag R
( redirect
) hinzufügen . Zum Beispiel:
# Externally "redirect" the request
RewriteCond %{QUERY_STRING} ^p=([^&]*)$ RewriteRule (.*/)$ /$1?page=%1 [R=302,L]
Wenn ich die Regel so ändere, dass sie
localhost/list/?p=2&?p=2
wie folgt lautet:RewriteEngine On RewriteCond %{QUERY_STRING} ^p=([^&]*)$ RewriteRule (.*/)$ $1&?page=%1 [L]
Ich erhalte die Meldung "Die angeforderte URL
/list/&
wurde auf diesem Server nicht gefunden." wie '?' Schneiden Sie das Umschreiben
Wenn Sie dies anfordern localhost/list/?p=2&?p=2
(aber warum?), Werden die oben genannten Anweisungen überhaupt nichts tun, da die Bedingung nicht übereinstimmt.
Warum haben Sie &
der RewriteRule
Ersetzungszeichenfolge ein hinzugefügt ? (Das macht keinen Sinn?) Das würde in der Tat zu einem URL-Pfad des Formulars führen /list/&
, wenn die Regel verarbeitet würde. Aber wie gesagt, es würde nicht für die URL verarbeitet, die Sie angegeben haben?