2015-05-16 17 views
5

Ho appena spostato una delle nostre applicazioni principali da Windows + IIS + Coldfusion a Ubuntu + Apache + Lucee. Il primo grosso problema è la codifica dell'URI per alfabeti esotici.Problema di codifica URI Lucee (cirillico)

Per esempio, cercando di raggiungere questo URL http://www.example.com/ru/Солнцезащитные-очки/saint-laurent/ risultati in questo disco nel access.log di Apache:

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/ 

Beh, credo che sia corretta codifica URL. Quindi uso una regola di riscrittura nel file .htaccess per ottenere quella porzione dell'URL (quella cirillica) in un parametro di stringa di query url (diciamo "foo").

Utilizzando cflog a discarica, vedo nel registro dell'applicazione:

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

... che è ovviamente sbagliato, perché quello che mi serve è la stringa originale, in UTF-8 cirillico.

ho cercato di mettere parametro URIEncoding nel mio server.xml Tomcat http connettore, senza risultati:

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

Come posso ottenere il mio parametro URL in UTF-8?

+1

La prima cosa che proverei sarebbe isolare Tomcat e testarlo direttamente. provate http: // hostname: 8888/index.cfm? foo = Солнцезащитные-очки. Se funziona correttamente, il problema è sul lato Apache/mod_rewrite. Questo potrebbe aiutare a focalizzare la domanda. Se si verifica ancora un problema, è possibile anche esaminare i registri di accesso di tomcat per un ulteriore isolamento (potrebbe trattarsi di un problema di lucee piuttosto che di un tomcat). –

+0

Ho provato e funziona se richiama direttamente lucee passando il parametro cirillico come hai scritto. Quindi ... è un problema di mod_rewrite di apache? Perché cambia la mia codifica?!? –

+0

Che non posso dirvi (non la mia area di conoscenza). Ma potresti riformulare la domanda come una riscrittura di Apache/Mod e fornire alcuni dettagli in modo che alcuni esperti in quell'area possano aiutarti (anche se sembra che non dovresti usare questi URL affatto). –

risposta

2

Ho trovato la soluzione da solo.

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

Apache

Generalmente non è necessario preoccuparsi di Apache come non dovrebbe essere scherzi con la tua HTML o URL. Tuttavia, se stai facendo un po 'di proxy con mod_proxy allora potresti aver bisogno di pensare a questo . Usiamo mod_proxy per fare il proxy da Apache a Tomcat. Se hai i caratteri codificati nell'URL che devi convertire in una stringa di query per l'app sottostante, avrai uno strano problema .

Se si dispone di un URL che entrano in Apache che assomiglia a questo:

http://mydomain/%E4%B8%AD.doc e si dispone di una regola mod_rewrite/procura come questo:

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

Sfortunatamente il $ 1 sta per essere mutilato durante la riscrittura. QSA (QueryStringAppend) si occupa effettivamente di questi caratteri e lo invierà semplicemente invariato, ma quando prendi un po 'dell'URL come il mio $ 1 qui i caratteri vengono storpiati mentre Apache prova a fare qualcosa senza escape dei suoi proprio in ISO-8859-1, ma è UTF-8 non ISO-8859-1 quindi non funziona correttamente. Quindi, per mantenere i nostri caratteri speciali in UTF-8, lo faremo nuovamente scappare.

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

Date un'occhiata a vostri ceppi di riscrittura per vedere se questo funziona.

Davvero difficile da trovare.

1

Il migliore è non per utilizzare il cirillico nell'URI in nessuna circostanza. È una pratica molto brutta includere qualcosa tranne ASCII. Ti sto dicendo da qui Mosca, Russia come madrelingua russa.

C'è una cosiddetta traslitterazione russa (romanizzazione del russo) in cui una qualsiasi di 33 lettere potrebbe essere trasformata in latino direttamente. È possibile applicare tale traslitterazione per decodificare il russo in latino e viceversa in background.

Qualcosa di simile a questo:

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

O semplicemente utilizzare un numero di identificazione al posto del testo, se è possibile.