5

コア アプリの 1 つを Windows+IIS+Coldfusion から Ubuntu+Apache+Lucee に移動しました。最初の大きな問題は、エキゾチックなアルファベットの URI エンコーディングです。

たとえば、この URL にアクセスしようとするとhttp://www.example.com/ru/Солнцезащитные-очки/saint-laurent/、Apache access.log に次のレコードが記録されます。

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/

まあ、それは正しくURLエンコードされていると思います。次に、.htaccess ファイルで書き換えルールを使用して、URL クエリ文字列パラメーター (「foo」としましょう) で URL のその部分 (キリル文字) を取得します。

cflog を使用してダンプすると、アプリケーション ログに次のように表示されます。

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

...これは明らかに間違っています。必要なのは元の文字列であり、utf-8 キリル文字です。

server.xml tomcat http コネクタに URIEncoding パラメータを入れようとしましたが、結果はありませんでした:

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

URL パラメータを UTF-8 で取得するにはどうすればよいですか?

4

2 に答える 2

2

私は自分で解決策を見つけました。

ソース: http://blogs.warwick.ac.uk/kieranshaw/entry/utf-8_internationalisation_with

アパッチ

通常、Apache について心配する必要はありません。Apache は HMTL や URL をいじってはならないからです。ただし、mod_proxy でプロキシを行っている場合は、これについて考える必要があるかもしれません。mod_proxy を使用して、Apache から Tomcat へのプロキシを行います。基になるアプリのクエリ文字列に変換する必要があるエンコードされた文字が URL にある場合、奇妙な小さな問題が発生します。

次のような URL が Apache に入るとします。

http://mydomain/%E4%B8%AD.docで、次のような mod_rewrite/proxy ルールがあります。

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

残念ながら、書き換え中に $1 が壊れてしまいます。QSA (QueryStringAppend) は実際にはこれらの文字を問題なく処理し、そのまま送信しますが、ここで私の $1 などの URL の一部を取得すると、Apache が独自の ISO へのエスケープ解除を試みるため、文字が壊れてしまいます。 8859-1 ですが、ISO-8859-1 ではなく UTF-8 であるため、正しく動作しません。したがって、特殊文字を UTF-8 のままにしておくために、もう一度エスケープします。

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

書き換えログを見て、これが機能しているかどうかを確認してください。

本当に見つけにくい。

于 2015-05-26T07:23:22.477 に答える
1

最良の方法は、どのような状況でも URI にキリル文字を使用しないことです。そこにASCII以外のものを含めるのは非常に悪い習慣です。ここロシアのモスクワから、ロシア語のネイティブ スピーカーとしてお話しします。

いわゆるロシア語の音訳 (ロシア語のローマ字化) があり、33 文字のいずれかを直接ラテン語に変換できます。このような文字変換を適用して、バックグラウンドでロシア語からラテン語に、またはその逆にデコードすることができます。

このようなもの:

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

または、可能であれば、テキストの代わりに ID 番号を使用してください。

于 2015-05-16T13:22:32.293 に答える