2015-05-16 8 views
5

मैंने विंडोज़ + आईआईएस + कोल्डफ्यूजन से हमारे मूल ऐप्स में से एक को उबंटू + अपाचे + लुसी में ले जाया। पहली बड़ी समस्या विदेशी अक्षरों के लिए यूआरआई एन्कोडिंग है।लुसी यूआरआई एन्कोडिंग समस्या (साइरिलिक)

उदाहरण के लिए, इस यूआरएल http://www.example.com/ru/Солнцезащитные-очки/saint-laurent/ परिणाम इस रिकॉर्ड में अपाचे 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 फ़ाइल में एक पुनर्लेखन नियम का उपयोग करता हूं (मान लें "foo")।

यह डंप करने के लिए cflog का उपयोग करना, मैं आवेदन लॉग में देखें:

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

... जो स्पष्ट रूप से गलत है, क्योंकि मैं क्या जरूरत है मूल स्ट्रिंग, utf-8 सिरिलिक में है।

मैं अपने server.xml बिल्ला http कनेक्टर में URIEncoding पैरामीटर डालने की कोशिश की, कोई परिणाम नहीं के साथ:

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

मैं UTF-8 में मेरी url पैरामीटर कैसे मिल सकता है?

+1

पहली चीज जो मैं कोशिश करूंगा वह टॉमकैट को अलग करना और सीधे परीक्षण करना होगा। यानी http: // hostname: 8888/index.cfm? foo = Солнцезащитные-очки आज़माएं। अगर यह सही तरीके से काम करता है - आपकी समस्या अपाचे/mod_rewrite पक्ष पर है। यह सवाल पर ध्यान केंद्रित करने में मदद कर सकता है। यदि अभी भी कोई समस्या है, तो आप आगे अलगाव के लिए टॉमकैट एक्सेस लॉग भी देख सकते हैं (शायद यह वास्तव में टॉमकैट की बजाय एक लुसी मुद्दा है)। –

+0

मैंने कोशिश की और यह काम करता है अगर मैं सीधे लिखने के दौरान सिरिलिक पैरामीटर को गुजरने वाले लूस को बुलाता हूं। तो ... क्या यह एक अपाचे mod_rewrite मुद्दा है? यह मेरे एन्कोडिंग को क्यों बदलता है?! –

+0

कि मैं आपको नहीं बता सकता (ज्ञान का मेरा क्षेत्र नहीं)। लेकिन आप इस सवाल को अपाचे/मॉड को फिर से लिख सकते हैं और कुछ विवरण प्रदान कर सकते हैं ताकि उस क्षेत्र के कुछ विशेषज्ञ मदद कर सकें (हालांकि ऐसा लगता है कि आपको इन यूआरएल का उपयोग नहीं करना चाहिए)। –

उत्तर

2

मुझे अपने आप से समाधान मिला।

स्रोत: http://blogs.warwick.ac.uk/kieranshaw/entry/utf-8_internationalisation_with

अपाचे

आम तौर पर आप अपाचे के बारे में चिंता के रूप में यह अपने HMTL या यूआरएल के साथ खिलवाड़ नहीं होना चाहिए की जरूरत नहीं है। हालांकि, अगर आप कुछ mod_proxy के साथ proxying कर रहे हैं तो आपको के बारे में सोचने की आवश्यकता हो सकती है। हम अपाचे से टॉमकैट तक प्रॉक्सी करने के लिए mod_proxy का उपयोग करते हैं। यदि आपके पास URL में एन्कोड किए गए वर्ण हैं जिन्हें आपको में अपने अंतर्निहित ऐप के लिए कुछ क्वेरी स्ट्रिंग में कनवर्ट करने की आवश्यकता है तो आपके पास अजीब छोटी समस्या होगी।

आप एक URL अपाचे में आ रहा है कि इस तरह दिखता है है:

http://mydomain/%E4%B8%AD.doc और आप इस तरह एक mod_rewrite/प्रॉक्सी नियम है:

RewriteRule ^/(।*) http://mydomain:8080/filedownload/?filename= $ 1 [क्यूएसए, एल, पी]

दुर्भाग्यवश $ 1 पुनर्लेख के दौरान उलझन में जा रहा है। क्यूएसए (QueryStringAppend) वास्तव में इन वर्णों के साथ वास्तव में ठीक है और इसे बिना छेड़छाड़ के माध्यम से भेज देगा, लेकिन जब आप यूआरएल जैसे मेरा $ 1 यहां ले लेंगे तो अक्षरों को उलझन में डाल दिया जाएगा क्योंकि अपाचे पर कुछ अनदेखा करता है आईएसओ -885 9 -1 में स्वयं है, लेकिन यह यूटीएफ -8 आईएसओ -885 9 -1 है इसलिए यह ठीक से काम नहीं करता है। इसलिए, यूटीएफ -8 में हमारे विशेष वर्ण रखने के लिए, हम इसे फिर से बच जाएंगे।

RewriteMap भागने पूर्णांक: बच RewriteRule ^/ http://mydomain:8080/filedownload/?filename= $ {भागने: $ 1} (*।) [QSA, एल, पी]

अगर यह काम कर रहा है देखने के लिए आपका रीराइट लॉग पर एक नजर डालें।

वास्तव में खोजने के लिए मुश्किल है।

1

सबसे अच्छा किसी भी परिस्थिति में यूआरआई में सिरिलिक का उपयोग करने के लिए सबसे अच्छा है। वहां एएससीआईआई को छोड़कर कुछ शामिल करना बहुत बुरा अभ्यास है। मैं आपको मॉस्को, रूस से देशी रूसी वक्ता के रूप में बता रहा हूं।

एक तथाकथित रूसी लिप्यंतरण (रूसी का रोमनकरण) है जहां 33 अक्षरों में से कोई भी सीधे लैटिन में परिवर्तित किया जा सकता है। आप लैटिन से लैटिन और पृष्ठभूमि में इसके विपरीत डीकोड करने के लिए ऐसे लिप्यंतरण को लागू कर सकते हैं।

कुछ इस तरह:

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

या सिर्फ एक आईडी के बजाय की संख्या पाठ का उपयोग करता है, तो यह संभव है।

संबंधित मुद्दे