2015-05-16 15 views
5

Ich habe gerade eine unserer Kern-Apps von Windows + IIS + Coldfusion auf Ubuntu + Apache + Lucee verschoben. Das erste große Problem ist die URI-Codierung für exotische Alphabete.Lucee URI Kodierungsproblem (kyrillisch)

Zum Beispiel versuchen, diese URL http://www.example.com/ru/Солнцезащитные-очки/saint-laurent/ Ergebnisse in dieser Datensatz in der Apache access.log zu erreichen:

http://www.example.com/ru/%D0%A1%D0%BE%D0%BB%D0%BD%D1%86%D0%B5%D0%B7%D0%B0%D1%89%D0%B8%D1%82%D0%BD%D1%8B%D0%B5-%D0%BE%D1%87%D0%BA%D0%B8/saint-laurent/ 

Nun, ich denke, das ist richtig URL-codiert. Dann benutze ich eine Rewrite-Regel in .htaccess-Datei, um diesen Teil der URL (die kyrillische) in einem URL-Abfrage-String-Parameter (sagen wir "foo") zu bekommen.

cflog Mit ihm abzuladen, ich sehe in dem Anwendungsprotokoll:

/index.cfm?foo=оÑки-длÑ-зÑениÑ& 

... was offensichtlich falsch ist, weil das, was ich brauche, ist die ursprüngliche Zeichenfolge, in utf-8 kyrillisch.

Ich versuchte URIEncoding Parameter in meinem server.xml tomcat http-Anschluss, ohne Ergebnisse zu setzen:

<Connector port="8888" protocol="HTTP/1.1" 
       connectionTimeout="20000" 
       redirectPort="8443" 
       URIEncoding="UTF-8" /> 

Wie kann ich meine URL-Parameter in UTF-8?

+1

Das erste, was ich versuchen würde wäre Tomcat zu isolieren und das direkt zu testen. h., versuchen Sie es mit http: // hostname: 8888/index.cfm? foo = Солнцезащитные-очки. Wenn das richtig funktioniert - Ihr Problem ist auf der Seite Apache/mod_rewrite. Dies könnte helfen, die Frage zu fokussieren. Wenn Sie immer noch ein Problem haben, können Sie sich auch die Tomcat-Zugriffsprotokolle für die weitere Isolierung ansehen (vielleicht ist es in der Tat eher ein Lukee-Problem als ein Tomcat-Problem). –

+0

Ich habe versucht und es funktioniert, wenn ich Lucee direkt den kyrillischen Parameter übergeben, wie Sie geschrieben haben. Also ... ist das ein Apache mod_rewrite Problem? Warum ändert sich meine Codierung?!? –

+0

Das kann ich dir nicht sagen (nicht mein Fachgebiet). Aber Sie könnten die Frage als Apache/Mod umschreiben und einige Details angeben, damit einige Experten in diesem Bereich helfen könnten (obwohl es so aussieht, als würden Sie diese URLs überhaupt nicht verwenden). –

Antwort

2

Ich fand die Lösung alleine.

Quelle: http://blogs.warwick.ac.uk/kieranshaw/entry/utf-8_internationalisation_with

Apache

Im Allgemeinen müssen Sie nicht über Apache kümmern, da es nicht Messing mit Ihrem HMTL oder URLs sein sollte. Allerdings, wenn Sie einige Proxy mit mod_proxy tun, dann müssen Sie möglicherweise über dies denken. Wir benutzen mod_proxy um Proxying von Apache zu Tomcat durchzuführen. Wenn Sie codierte Zeichen in der URL haben, die Sie in einige Abfragezeichenkette für Ihre zugrundeliegende APP umwandeln müssen, dann haben Sie ein merkwürdiges kleines Problem .

Wenn Sie eine URL in Apache kommen, die wie folgt aussieht:

http://mydomain/%E4%B8%AD.doc und Sie haben eine mod_rewrite/Proxy-Regel wie folgt aus:

RewriteRule ^/(.*) http://mydomain:8080/filedownload/?filename= $ 1 [QSA, L, P]

Leider wird der $ 1 während des Umschreibens verstümmelt. QSA (QueryStringAppend) befasst sich tatsächlich mit diesen Zeichen gut und wird dies durch unberührte, aber wenn Sie ein bisschen von der URL wie meine $ 1 hier greifen dann werden die Charaktere verstümmelt, wie Apache versucht, einige Unescaping seiner zu tun in ISO-8859-1 besitzen, aber es ist UTF-8 nicht ISO-8859-1, so dass es nicht richtig funktioniert. Also, um unsere speziellen Zeichen in UTF-8 zu behalten, werden wir es wieder zurückbekommen.

RewriteMap Flucht int: escape RewriteRule ^/ http://mydomain:8080/filedownload/?filename= $ {escape: $ 1} (. *) [QSA, L, P]

einen Blick auf Ihre Rewrite-Logs zu sehen, ob das funktioniert.

Wirklich schwer zu finden.

1

Das beste ist nicht zu verwenden kyrillisch in URI unter keinen Umständen. Das ist eine sehr schlechte Methode, etwas außer ASCII einzubinden. Ich erzähle dir von hier aus Moskau, Russland als gebürtiger Russe.

Es gibt eine sogenannte russische Transliteration (Romanisierung des Russischen), wo jeder der 33 Buchstaben direkt in Latein umgewandelt werden konnte. Sie können eine solche Transliteration anwenden, um im Hintergrund Russisch auf Latein und umgekehrt zu dekodieren.

Etwas wie folgt aus:

hostname:8888/index.cfm?foo=Solntsezaschitnye-ochki 

Oder benutzen Sie einfach eine ID-Nummer anstelle von Text, wenn es möglich ist.