Rewrite-Regel mit QUERY_STRING funktioniert nicht

Oct 22 2020

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

1 MrWhite Oct 22 2020 at 14:13
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, da p=es nicht als Teil des URL-Pfads auftritt (es ist Teil der Abfragezeichenfolge). Das RewriteRule 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_STRINGServervariable anstelle des erforderlichen URL-Parameters valuein der Ersetzungszeichenfolge . Ist QUERY_STRINGaber offensichtlich die gesamte "Abfragezeichenfolge", so würde am Ende eine fehlerhafte Abfragezeichenfolge des Formulars erstellt werden : page=p=<value>.

  • Die Verwendung der QSAFlagge 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 im RewriteRule 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 %1Rückreferenz bezieht sich auf die erfasste Gruppe im zuletzt übereinstimmenden CondPattern , d. H. der Wert des pURL-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=2ich 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=2nicht 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=2wie 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?