2015-05-16 35 views
5

我剛剛將我們的核心應用程序之一從Windows + IIS + Coldfusion移至Ubuntu + Apache + Lucee。第一個大問題是異國字母的URI編碼。Lucee URI編碼問題(西裏爾字母)

例如,試圖達到這個網址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西里爾。

我試圖把的URIEncoding參數在我的server.xml中的T​​omcat HTTP連接器,但沒有任何結果:

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

我怎樣才能在UTF-8我的URL參數?

+1

我會嘗試的第一件事是隔離tomcat並直接測試。即嘗試http://主機名:8888/index.cfm?foo =Солнцезащитные-очки。如果工作正常 - 你的問題是在Apache/mod_rewrite方面。這可能有助於聚焦這個問題。如果還存在問題,您還可以查看tomcat訪問日誌以進一步隔離(也許這確實是lucee問題,而不是tomcat問題)。 –

+0

我試過了,如果我直接調用通過西里爾文參數的lucee,它就會起作用。所以...是一個Apache的mod_rewrite問題?爲什麼它會改變我的編碼?!? –

+0

我不能告訴你(不是我的知識領域)。但是,您可以將問題重新編寫爲Apache/Mod,並提供一些細節,以便該領域的一些專家可以提供幫助(儘管看起來您應該完全不使用這些URL)。 –

回答

2

我自己找到了解決方案。

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

阿帕奇

一般來說,你不必擔心Apache作爲它不應該是 與HMTL或URL搞亂。但是,如果你正在用mod_proxy代理一些 ,那麼你可能需要考慮一下 這個。我們使用mod_proxy從Apache到Tomcat進行代理。 如果你在URL中有編碼字符,你需要將其轉換爲 你的底層應用程序的一些查詢字符串,那麼你將有一個奇怪的小問題 。

如果你有進入Apache的一個URL,看起來像這樣:

http://mydomain/%E4%B8%AD.doc和你有一個mod_rewrite的/代理規則 這樣的:

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

不幸的是,1美元在重寫過程中會發生錯位。 QSA (QueryStringAppend)實際上處理這些字符就很好, 將通過原封不動地發送,但是當您在此處獲取URL (例如我的$ 1)時,字符會因爲Apache嘗試 做一些修改擁有ISO-8859-1,但它的UTF-8不是 ISO-8859-1,所以它不能正常工作。所以,爲了讓我們的特殊 字符保持UTF-8格式,我們將再次迴避它。

RewriteMap指令逃逸INT:逃跑的RewriteRule ^/ http://mydomain:8080/filedownload/?filename= $ {逃生:$ 1}(*)[QSA,L,P]

看看你重寫日誌,看是否能正常工作。

真的很難找到。

1

最好的是不是在任何情況下都使用URI中的西里爾文。在那裏包含除ASCII之外的東西是非常糟糕的做法。我從俄羅斯的莫斯科告訴你,你是俄語母語的人。

有一種所謂的俄語音譯(俄語羅馬化),33個字母中的任何一個都可以直接轉換成拉丁文。您可以將這種音譯應用於解碼俄語到拉丁語,反之亦然。

事情是這樣的:

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

或者只是使用一個ID號碼,而不是文本,如果它是可能的。