2016-06-26 9 views
1

Ich möchte eine Apache-Umgebungsvariable basierend auf Query-String-Variable, aber ohne einige Parameter festlegen.Htaccess-Umgebungsvariable basierend auf Abfragezeichenfolge ohne einige Pamameter

zum Beispiel habe ich diese Abfrage-String:

utm_source=foo&my_param=baz&utm_medium=bar&_t=9999 

jetzt, ich will eine Variable ohne utm_source und utm_medium:

my_param=baz&_t=9999 

Ich kenne die Parameter nur entfernen (utm_source & utm_medium) ... die anderen sind nur ein Beispiel ...

ich habe wtrite dieser Code:

RewriteEngine On 
RewriteBase/

RewriteRule^- [E=CustomQueryString:%{QUERY_STRING}] 

RewriteCond %{ENV:CustomQueryString} ^(.*)&?(utm_source|utm_medium)=[^&]+&?(.*)$ [NC] 
RewriteRule^- [E=CustomQueryString:%1%3] 

die Ausgabe

utm_source=foo&my_param=baz&_t=9999 

warum utm_source param bestehen?

ich habe auch versucht:

RewriteRule^- [E=CustomQueryString:%{QUERY_STRING}] 

RewriteCond %{ENV:CustomQueryString} ^(.*)&?utm_source=[^&]+&?(.*)$ [NC] 
RewriteRule^- [E=CustomQueryString:%1%2] 

RewriteCond %{ENV:CustomQueryString} ^(.*)&?utm_medium=[^&]+&?(.*)$ [NC] 
RewriteRule^- [E=CustomQueryString:%1%2] 

der Ausgang ist richtig!

a=b&my_param=baz&_t=9999 

ich verstehe nicht, warum diese Version nicht funktioniert!

RewriteCond %{ENV:CustomQueryString} ^(.*)&?(utm_source|utm_medium)=[^&]+&?(.*)$ [NC] 
RewriteRule^- [E=CustomQueryString:%1%3] 

Antwort

1

Diese Bedingung

RewriteCond %{ENV:CustomQueryString} ^(.*)&?(utm_source|utm_medium)=[^&]+&?(.*)$ [NC] 

nicht entfernt sowohl utm_sourceundutm_medium, weil es nur ein von ihnen übereinstimmt.

.* entspricht der längsten möglichen Zeichenkette, einschließlich einer von utm_source oder utm_medium, je nachdem, was zuerst eintritt. Siehe auch Repetition with Star and Plus, insbesondere Abschnitt Watch Out for The Greediness! und folgende, für eine detaillierte Erklärung.

utm_source|utm_medium bedeutet im Klar Englisch: Entweder utm_sourceoderutm_medium entsprechen. So ist der reguläre Ausdruck

(.*)       - %1, including utm_source 
(utm_source|utm_medium)=[^&]+ - utm_medium=... 
(.*)       - %3, everything else after utm_medium 

Die zweite Variante mit zwei Bedingungen und Regeln funktioniert, weil Sie zuerst utm_source=... entfernen und dann die restliche Zeichenfolge in den zweiten Zustand übergeben. Dort wird der utm_medium=... Teil entfernt, und schließlich haben Sie die gewünschte Zeichenfolge ohne utm_source und utm_medium.


Sie können den Test-String mit & s einschließen. Dies garantiert, dass Sie immer ein kaufmännisches Und vor und nach dem utm_source=... Teil haben und erlaubt, den regulären Ausdruck ein wenig zu vereinfachen.

RewriteCond &%{ENV:CustomQueryString}& ^(.*)&utm_source=.+?&(.*)$ [NC] 

Das Gleiche gilt für die zweite RewriteCond mit utm_medium.

+0

Dank für die Erläuterung. Es ist möglich, die erste Regel zu beheben? Die erste Regel hat weniger Code und ist besser lesbar ... –

+0

Sie können etwas wie '(. *) & (?: utm_source | utm_medium) ... (. *) ... (?: utm_source | utm_medium) verwenden. . & (. *) 'und haben als Ergebnis"% 1% 2% 3 ", aber das passt nur, wenn immer beide Argumente vorhanden sind. Ihre Lösung mit zwei Regeln sieht so aus, als wäre sie das Optimum. –

+0

ok! Danke und Entschuldigung für mein schlechtes Englisch! –

1

Sie können diese 2-Regel verwenden, um beiden Abfrageparameter zu entfernen:

RewriteRule^- [E=CustomQueryString:%{QUERY_STRING}] 

# remove utm_source from query string and set env var 
RewriteCond %{ENV:CustomQueryString} ^(.*&)?utm_source=[^&]*(?:&(.*))?$ [NC] 
RewriteRule^- [E=CustomQueryString:%1%2] 

# remove utm_medium from query string and reset env var 
RewriteCond %{ENV:CustomQueryString} ^(.*&)?utm_medium=[^&]*(?:&(.*))?$ [NC] 
RewriteRule^- [E=CustomQueryString:%1%2] 

Wenn wir mit URL als /?utm_source=foo&my_param=baz&utm_medium=bar&_t=9999

Nach 2. Regel starten wir haben:

$_SERVER["CustomQueryString"] becomes `my_param=baz&_t=9999` 
+1

Aber wenn QUERY_STRING nicht utm_source enthält, wird env CustomQueryString nicht gesetzt und die zweite Regel schlägt fehl? –

+0

Sie haben geschrieben: Ich kenne nur die zu entfernenden Parameter (utm_source & utm_medium) '. Dies vermittelt den Eindruck, dass der Abfrage-String beide Parameter hat. Wenn nicht, bitte klären Sie – anubhava

+0

BTW die Regel, die Sie in Frage gezeigt haben, ist völlig richtig. Testen Sie das mit '/? Myutm_source = foo & mein_param = baz & utm_medium = bar & _t = 9999' und' CustomQueryString' wird auf 'mymy_param = baz & _t = 9999' gesetzt – anubhava

Verwandte Themen