• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

[FRAGE] htaccess REQUEST_URI escapen

J

j-l-n

Guest
Folgende RewriteRule:
Code:
RewriteRule . http://server2.tld/?url=%{HTTP_HOST}%{REQUEST_URI} [L,QSA,R,B]
Warum wird trotz des B-Flags REQUEST_URI nicht escaped?
 
Zuletzt bearbeitet:
Soweit ich das verstanden habe, wirkt das B-Flag nur auch gematchte Dinge (also $1 oder %1).
Probier' mal aus, ob es funktioniert, wenn du vorher eine RewriteCond auf REQUEST_URI machst, die einfach immer alles matched (^(.*)$), und dann %1 in der RewriteRule verwendest.
 
Das verstehe ich gerade nicht:
Code:
RewriteCond %{REQUEST_URI} ^(.*)$
RewriteRule . http://server2.tld/?url=%{HTTP_HOST}%1 [L,QSA,R,B]
sollte eigentlich gehen (hab's aber nicht ausprobiert). Warum soll da der Query-Teil nicht escaped werden, wenn der Rest escaped wird?

Willst du einen Proxy Server machen?
 
Die Variante von dir escaped nur Dateinamen und Pfad. Beim Queryteil (z.B. ?get=param&param2) wird das & nicht escaped, weshalb PHP davon ausgeht, dass der Teil ab da ein neuer GET-Parameter ist.
 
Zuletzt bearbeitet:
OK - wusste ich nicht...

aber das sollte eigentlich kein Problem sein (das ? sowieso nicht). Wenn das teil nur einen Parameter (url) erwartet, kannst du doch alle & die dahinter kommen einfach zum Wert von url dazuzählen. Du kannst dich hald nicht auf die Standardwerkzeuge verlassen, sondern musst den Query-String selbst auseinanderbauen. Was willst du damit eigentlich machen?
 
Das Problem hängt mit meinem Lösungsversuch für Cross-Domain-Cookies zusammen. Wenn ich das dann fertig habe, erkennst du bestimmt die Ursache.
Aus dem Querystring auszulesen ist aus diversen Gründen in diesem Fall sehr fehleranfällig. Deswegen möchte ich REQUEST_URI encodiert in die GET-Variable "url" bekommen. Und das wird durch das unkodierte "&" verhindert...
 
Zuletzt bearbeitet:
In PHP kannst du doch mit $_SERVER["QUERY_STRING"] alles nach dem ersten "?" bekommen. Nimm' dir das und setze als Wert alles, was nach dem ersten "url=" kommt.
 
Jep, so wollte ich's auch machen. Aber davor könnte zufällig noch ein weiterer Parameter namens "url" kommen, der dann alles zerstört.
Gäbe es nicht irgendwie die Lösung, mit mehreren Rewrite-Bedingungen zu arbeiten, die jeweils auf den Query-Teil matchen? Den gematchen Teil könnte man ja dann problemlos anhängen.
Oder wäre es möglich, alle "&" durch eine zweite RewriteRule noch vor dem Umleiten durch "%26" ersetzen?
 
Zuletzt bearbeitet:
Wie kann davor noch ein "url" kommen? Du baust in der RewriteRule doch die URL zusammen und da hast du das "url" gleich nach dem "?"...

Man kann mit mehreren RewriteCond arbeiten, aber die %-Matches beziehen sich immer auf den die Letzte.

Und einfache Stringersetzungen kann man in mod_rewirte (soweit ich weiß) nicht machen.
 
Wie kann davor noch ein "url" kommen? Du baust in der RewriteRule doch die URL zusammen und da hast du das "url" gleich nach dem "?"...
Das war nur ein vereinfachtes Beispiel. Außerdem geht es auch um den Fall, dass ein Nutzer die Seite manuell aufruft (theoretisch könnte er dann zusätzliche GET-Parameter hinzufügen).

Und einfache Stringersetzungen kann man in mod_rewirte (soweit ich weiß) nicht machen.
Schade, wäre auch zu schön gewesen...


PS: ist das hier .htaccess - Rewrite rule url character replace - Stack Overflow irgendwie verwertbar? Schaut mir auf den ersten Blick recht vielversprechend aus, auch wenn ich von mod_rewrite leider nur sehr wenig verstehe.
 
Zuletzt bearbeitet:
Nach ein dutzend Seiten Google-Treffern habe ich noch folgenden Foreneintrag gefunden:
I wrote this code last yeaar after reading similar question in other forum.
This RewriteRule escape & to %26, as ampescape would do (with RewriteMap).
It's for someone who doesn't have access to RewriteMap + ampescape.
Code:
RewriteRule ^/*whatever\.php - [L]
RewriteRule ^([^&]*)&(.*)$ $1\%26$2 [NE,N]
RewriteRule ^([^&]*)$ whatever.php?title=$1 [L]

Allerdings bekomme ich das bisher nicht zum Laufen...
 
Zuletzt bearbeitet:
In dieser Form wird das bei dir nicht funktionieren, da du das "&" ja im Query-String und nicht Pfad hast.
Damit da funktioniert muss du eine RewriteCond auf QUERY_STRING machen, das dir dein & dann matched.
 
Ich hab's geschafft, den Code von dem oben verlinkten Thread so anzupassen, dass er das tut, was ich erreichen wollte:
Code:
RewriteCond %{QUERY_STRING} ^$
RewriteRule ^ http://server2.tld/?url=http://%{HTTP_HOST}%{REQUEST_URI} [L,NE]

RewriteCond %{QUERY_STRING} ^(.*?)(\&)(.*)$
RewriteRule ^ http://server2.tld/?url=http://%{HTTP_HOST}%{REQUEST_URI}?%1\%26%3 [N,NE]
 
Zuletzt bearbeitet:
Nun bleibt nur noch ein Problem: das Ganze funktioniert nicht bei einer URL, die zwar einen Query-String hat, aber nur einen einzigen und nicht mehrere mit "&" verbundene...
Wie bekomme ich das hin?

So soll es umleiten:

http://example.com/path/file.php -> http://server2.tld/?url=http://example.com/path/file.php - funktioniert
http://example.com/path/file.php?get&param&param2 -> http://server2.tld/?url=http://example.com/path/file.php?get%26param%26param2 - funktioniert
http://example.com/path/file.php?get -> http://server2.tld/?url=http://example.com/path/file.php?get - so sollte er eigentlich umleiten, funktioniert aber nicht

- - - Aktualisiert - - -

Warum hat das jetzt den letzten Post nicht mit dem vorherigen zusammengeführt? Ich dachte, wir hätten das Limit für "Beiträge zusammenfassen" erhöht? :confused:
 
Zuletzt bearbeitet:
Du musst die erste Regel so umschreiben, dass sie auf alle Query-Strings passt, die kein einziges "&" enthalten:
Code:
RewriteCond %{QUERY_STRING} ^([^&]+)$
RewriteRule ^ http://server2.tld/?url=http://%{HTTP_HOST}%{REQUEST_URI}?%1 [L,NE]
 
Problem: er leitet zwar jetzt um, aber der Dateiname wird nicht angehängt, sondern nur auf http://server2.tld/ weitergeleitet.
Ach ja, es sollte auch noch genauso umleiten, wenn gar kein GET-Parameter vorhanden ist.

PS: wie muss eine zusätzliche RewriteCond aussehen, damit alle RewriteRules und -Cond nur dann ausgeführt werden, wenn der Query-String NICHT auf "redirect" endet?
 
Problem: er leitet zwar jetzt um, aber der Dateiname wird nicht angehängt, sondern nur auf http://server2.tld/ weitergeleitet.
Hm... das kann ich mir gerade nicht erklären, da ja %1 reingebaut wird...
Ach ja, es sollte auch noch genauso umleiten, wenn gar kein GET-Parameter vorhanden ist.
kleiner Fehler
Code:
RewriteCond %{QUERY_STRING} ^([^&]*)$

PS: wie muss eine zusätzliche RewriteCond aussehen, damit alle RewriteRules und -Cond nur dann ausgeführt werden, wenn der Query-String NICHT auf "redirect" endet?
Code:
RewriteCond %{QUERY_STRING} !redirect$
sollte funktionieren.
 
kleiner Fehler
Code:
RewriteCond %{QUERY_STRING} ^([^&]*)$
Perfekt, danke dir - so klappt es einwandfrei!

Habe das jetzt folgendermaßen eingebaut:
Code:
RewriteCond %{QUERY_STRING} !redirect$
RewriteCond %{QUERY_STRING} ^([^&]*)$
RewriteRule ^ http://server2.tld/?url=http://%{HTTP_HOST}%{REQUEST_URI}\?%1 [L,NE]


RewriteCond %{QUERY_STRING} !redirect$
RewriteCond %{QUERY_STRING} ^(.*?)(\&)(.*)$
RewriteRule ^ http://server2.tld/?url=http://%{HTTP_HOST}%{REQUEST_URI}?%1\%26%3 [N,NE]
Nun bleibt nur noch zu beheben, dass die Umleitung nicht erfolgen soll, wenn der Query-String redirected ist. Denn auch mit den zwei RewriteConds wird man dennoch bei http://example.com/index.php?redirected bzw. http://example.com/index.php?get=param&redirected ebenfalls umgeleitet...
 
Zurück
Oben