2015-05-16 29 views
5

Właśnie przeniosłem jedną z naszych podstawowych aplikacji z Windows + IIS + Coldfusion do Ubuntu + Apache + Lucee. Pierwszym dużym problemem jest kodowanie URI dla egzotycznych alfabetów.Kodowanie URI Lucee (cyrylica)

Na przykład, starając się dotrzeć do tego URL http://www.example.com/ru/Солнцезащитные-очки/saint-laurent/ wyniki w tym zapis w access.log 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/ 

Cóż, myślę, że jest poprawnie zakodowany url. Następnie używam reguły przepisywania w pliku .htaccess, aby pobrać tę część adresu url (cyrylica) w parametrze ciągu zapytań url (powiedzmy "foo").

Korzystanie cflog aby go zrzucić, widzę w dzienniku aplikacji:

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

... co jest oczywiście błędne, ponieważ to, co potrzebne jest oryginalny łańcuch, w UTF-8 cyrylicą.

próbowałem umieścić parametr URIEncoding w moim server.xml tomcat http złącze, bez żadnych wyników:

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

Jak mogę dostać mój parametr URL w UTF-8?

+1

Pierwszą rzeczą, którą spróbowałbym wyizolować kocur i przetestować to bezpośrednio. np. spróbuj http: // nazwa hosta: 8888/index.cfm? foo = Солнцезащитные-очки. Jeśli to działa poprawnie - Twój problem jest po stronie Apache/mod_rewrite. To może pomóc w skoncentrowaniu się na tym pytaniu. Jeśli nadal występuje problem, możesz również przejrzeć dzienniki dostępu do tomcat w celu dalszej izolacji (być może jest to raczej problem lucee, a nie tomcat). –

+0

Próbowałem i działa, gdy bezpośrednio wywołuję lucee przekazując cyrylica jak pisałeś. Więc ... czy to problem z mod_rewrite w Apache? Dlaczego zmienia moje kodowanie?!? –

+0

Nie mogę ci powiedzieć (nie moja dziedzina wiedzy). Ale możesz zmienić to pytanie jako Apache/Mod przepisać i podać kilka szczegółów, aby niektórzy eksperci w tym obszarze mogli pomóc (chociaż wygląda na to, że nie powinieneś używać tych URL-i). –

Odpowiedz

2

Rozwiązanie znalazłem sam.

Źródło: http://blogs.warwick.ac.uk/kieranshaw/entry/utf-8_internationalisation_with

Apache

Generalnie nie trzeba się martwić o Apache, ponieważ nie powinno być brudząc z HMTL lub adresów URL. Jeśli jednak wykonujesz pewne proxy z mod_proxy, być może będziesz musiał pomyśleć o tym. Używamy mod_proxy do wykonywania proxy z Apache do Tomcat. Jeśli masz zakodowane znaki w adresie URL, które musisz przekonwertować na ciąg zapytania dla twojej aplikacji bazowej, to będziesz miał dziwny mały problem z .

Jeśli masz URL wejścia w Apache, który wygląda tak:

http://mydomain/%E4%B8%AD.doc i masz mod_rewrite/proxy reguły takiego:

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

Niestety, 1 $ zostanie zmiażdżony podczas przepisywania. QSA (QueryStringAppend) faktycznie radzi sobie z tymi znakami, a po prostu wyśle ​​to przez nietknięte, ale kiedy weźmiesz trochę URL-a , takiego jak mój 1 $ tutaj, wtedy postacie zostaną zmanipulowane, gdy Apache spróbuje uzyskać zrobić pewne cofnięcie swojej posiadać w ISO-8859-1, ale jest to UTF-8 nie ISO-8859-1, więc nie działa poprawnie. Tak więc, aby zachować specjalne znaki w UTF-8, unikniemy tego ponownie.

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

przyjrzeć dzienników przepisywania aby sprawdzić, czy to działa.

Naprawdę trudno znaleźć.

1

Najlepsze jest nie używać cyrylicy w URI w żadnych okolicznościach. To jest bardzo zła praktyka, aby włączyć tam coś poza ASCII. Mówię ci stąd, Moskwa, Rosja jako rodowita rosyjska mówczyni.

Istnieje tak zwana rosyjska transliteracja (romanizacja języka rosyjskiego), w której dowolna z 33 liter może zostać przekształcona bezpośrednio w łacinę. Możesz zastosować taką transliterację, aby rozszyfrować język rosyjski na łacinę i odwrotnie w tle.

coś takiego:

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

Lub po prostu użyć numeru identyfikacyjnego zamiast tekstu, jeśli jest to możliwe.