2017-07-27 8 views
1

Ich habe eine URL zu ersetzen, die.htaccess URL-Parameter „namen“

so etwas wie
http://example.com/shake/pokladna/?id=35601-JILOSRO&name=Jilo%20s.r.o.&address=Hrušková%202194&city=Sokolov&zipcode=35601 

sein werden ich diese Adresse auf dieses umleiten möchte (ich brauche „namen“ mit „name_gls“ ersetzen)

http://example.com/shake/pokladna/?id=35601-JILOSRO&name_gls=Jilo%20s.r.o.&address=Hrušková%202194&city=Sokolov&zipcode=35601 

Ist dieser Code in Ordnung?

RewriteCond %{QUERY_STRING} (.*)&?name=(.*)? [NC] 
RewriteRule ^pokladna/?$ $0?%1name_gls=%2 [R=301,L] 
+0

Wo setzen Sie diesen Code ein? Unterscheiden sich die URL-Parameter? Ist 'name' immer ein _internal_ URL-Parameter? Oder könnte es auch am Anfang der Abfragezeichenfolge erscheinen? – MrWhite

+0

Ich setze diesen Code auf .htaccess. Ja, die URL-Parameter variieren. API von Drittanbietern geben Sie mir diese Parameter zurück. Ich bin mir nicht sicher, ob es in Zukunft nicht geändert werden soll. –

+0

Aber wo ist die '.htaccess' Datei? Ich hätte angenommen, dass es sich um die '.htaccess'-Datei im Dokumenten-Root handelt, aber Ihr Code legt nahe, dass es sich im Unterverzeichnis'/shake' befindet. Dies könnte beabsichtigt sein, aber es könnte auch ein Fehler sein? – MrWhite

Antwort

0
RewriteCond %{QUERY_STRING} (.*)&?name=(.*)? [NC] 
RewriteRule ^pokladna/?$ $0?%1name_gls=%2 [R=301,L] 

Dies ist in der Nähe, aber nicht ganz korrekt. Wie bereits erwähnt, befinden sich diese Richtlinien in der WordPress-Datei .htaccess, die sich unter /shake/.htaccess befindet. Diese Anweisungen müssen vor alle vorhandenen WP-Direktiven gehen, wenn nicht bereits.

Die RewriteRuleSubstitution erfordert einen Schrägstrich-Präfix eine gültige externe Umleitung in einer pro-Verzeichnis .htaccess Datei zu machen. So wie es steht, schließt die Backreference $0 das Slash-Präfix aus, was zu einer relativen Pfadsubstitution führt - in diesem Fall wird das Verzeichnis-Präfix zurück hinzugefügt, was zu einer ungültigen Umleitung führt.

Ein weiteres mögliches Problem ist die optional& im CondPattern, dh. die &? in (.*)&?name=(.*)?. Bei der angegebenen Beispiel-URL funktioniert dies OK, da die vorangehende (.*)gierig ist, entspricht dies auch jedem Abfragezeichenfolgenparameternamen, der nur in "Name" endet. Zum Beispiel würde eine Abfragezeichenfolge des Formulars id=123&anothername=foo in id=123&anothername_gls=foo geändert werden - was ich bezweifle, ist wünschenswert. Ein Weg um dies zu verwenden ist Alternation, z. (^|.+&), um entweder den Anfang der Abfragezeichenfolge oder einem vorhergehenden URL-Parameter (und Parametertrennzeichen) zu entsprechen.

Ich würde auch die Verwendung der NC Flagge auf der RewriteCond Direktive in Frage stellen - sollte das wirklich eine case-insensitive Übereinstimmung sein?

Und Sie haben den Schrägstrich im URL-Pfad optional gemacht. Ist das wirklich optional? Wenn es dann ist, sollten Sie stattdessen sicherstellen, dass dies in der Substitution kanonisiert ist. Im folgenden Code gehe ich davon aus, dass der Schrägstrich obligatorisch ist, da er in Ihrem Beispiel vorhanden ist.

mit Ihrem spezifischen Beispiel benötigen Sie auch die NE (noescape) Flagge das% -encoded Räume zu verhindern (dh. %20) in dem Query-String doppelt codiert werden.

Also, diese Punkte zusammen zu bringen, versuchen Sie so etwas wie die folgenden statt:

RewriteCond %{QUERY_STRING} (^|.+&)name=(.*) 
RewriteRule ^pokladna/$ /$0?%1name_gls=%2 [NE,R,L] 

Beachten Sie, dass dies nur eine vorübergehende ist (302) umgeleitet werden. Ändern Sie die R zu R=301 nur, wenn Sie sicher sind, dass es OK funktioniert. Permanente Weiterleitungen können das Testen problematisch machen, da sie vom Browser zwischengespeichert werden.

Daher müssen Sie sicherstellen, dass der Browser-Cache vor dem Test gelöscht wird.

Und, wie oben erwähnt, diese vor die bestehenden Wordpress-Richtlinien hinausgehen müssen (insbesondere vor der Front-Controller).