2010-08-23 17 views
5

मैं एक यूआरएल निम्नलिखित युक्त है:अपाचे: यूआरएल में% 25 (400 गलत अनुरोध)

/somepath/morestuff/ohno%25foobar 

किसी कारण अपाचे के लिए रिपोर्ट कर रहा है एक 400 गलत अनुरोध (यह% के साथ कुछ है 25) । मैं अपने codeigniter उदाहरण को इंगित करने के लिए पथ को फिर से लिखने के लिए mod_rewrite का उपयोग कर रहा हूं लेकिन यह कोडनिर्देशक तक भी नहीं पहुंच रहा है, यह केवल डिफ़ॉल्ट अपाचे त्रुटि है।

कोई विचार?

+0

क्या कोई कारण है कि आपको '25% की आवश्यकता है? '% 25''% 'चिह्न के लिए कोड है। – Powerlord

+0

@ बेमरोस, यह वास्तव में एक एपीआई के लिए है जहां लोग कोई स्ट्रिंग पोस्ट कर सकते हैं। –

उत्तर

11

मुझे संदेह है कि आप अपने कोडइग्निटर अनुरोधों को संभालने के लिए PATH_INFO का उपयोग कर रहे हैं।

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^.*$ index.php/$0 [L] 

जब mod_rewrite अपने यूआरएल का परीक्षण करती है, वे पहले से ही, उनके प्राकृतिक चरित्र प्रारूप करने के लिए डीकोड किया गया है, इसलिए इस मामले %25 में सिर्फ % बन गया है: नतीजतन, आपके .htaccess का एक नियम सेट है कि इस के समान दिखता है शामिल हैं। जब आप इस नियम को लागू करते हैं, तो बैकरेफर में वास्तव में शाब्दिक पाठ somepath/morestuff/ohno%foobar होता है, जो डिफ़ॉल्ट रूप से पुनः-एन्कोड नहीं होता है। अपाचे को पता नहीं है कि % आपके अनुरोध पथ में /index.php/somepath/morestuff/ohno%foobar और चुक्स के साथ कर रहा है, जिससे आपको यह त्रुटि मिलती है।

यदि आप अपाचे 2.2, mod_rewrite चला रहे हैं, तो इस उद्देश्य के लिए B ध्वज जोड़ा गया है, जिससे आप अपने यूआरएल पर पुनः लिखे गए बैकरेफर से बच सकते हैं। अपने वर्तमान झंडा सूची में जोड़कर उस मामले में इस समस्या को ठीक करना चाहिए:

RewriteRule ^.*$ index.php/$0 [B,L] 

वहाँ भी है एक escapeRewriteMap कि mod_rewrite के पिछले अपाचे के संस्करणों में एक आंतरिक नक्शे के रूप में उपलब्ध है, लेकिन दुर्भाग्य से इस नक्शे में सक्षम होना चाहिए सर्वर या वर्चुअल सर्वर कॉन्फ़िगरेशन स्तर, इसलिए यदि आप साझा होस्टिंग पर अपनी साइट चला रहे हैं तो हो सकता है। यह वही बात करता है, हालांकि थोड़ा और जानबूझकर।

अपने सर्वर/आभासी सर्वर विन्यास में:

RewriteMap escape int:escape 

फिर, जहाँ भी आप अपने नियमों को परिभाषित:

RewriteRule ^.*$ index.php/${escape:$0} [L] 

ध्यान रखें कि CodeIgniter PATH_INFO उपयोग करने के लिए अनुरोध प्राप्त करने की आवश्यकता नहीं है जानकारी, और REQUEST_URI का उपयोग करके यहां पूरी तरह से स्वीकार्य है यदि आप mod_rewrite का उपयोग किसी भी अन्य रूपांतरण करने के लिए नहीं कर रहे हैं (और इस सिरदर्द को पूरी तरह से टालना होगा)। मुझे लगता है कि डिफ़ॉल्ट रूप से कोडइग्निटर AUTO से अनुरोध प्राप्त करने के लिए सेट है (मान लीजिए कि मुझे अपने ढांचे को मिश्रित नहीं किया गया है), इसलिए बस उस जानकारी को बनाने के लिए यूआरएल के अनुरोध को फिर से लिखना पर्याप्त नहीं होगा।

+0

मैं अपाचे 2.2 चला रहा हूं लेकिन बी फ्लैग काम नहीं करता है ... यह 500 का कारण बनता है। –

+0

@ केन स्ट्रूज़ - आपके त्रुटि लॉग को 500 के बारे में क्या कहना है? –

+0

का कहना है कि बी ध्वज अज्ञात है। मैं 2.2.3 और 2.2.7 चला रहा हूं बी फ्लैग जोड़ा। मेरे पास सर्वर तक पूर्ण पहुंच है (होस्टिंग साझा नहीं किया गया है) इसलिए मैं अपाचे के लिए जो कुछ भी करने की ज़रूरत है वह कर सकता हूं। –

1

अपाचे 2.2.12+, बस B ध्वज का उपयोग करें। यूआरएल के लिए आप इस इस तरह एन्कोड करने के लिए दोनों% और/सांकेतिक शब्दों में बदलना होगा सेट करने से पहले

http://www.dracos.co.uk/code/apache-rewrite-problem/

1

jQuery में .....: अन्यथा, यहाँ देखें "encodeURI (encodeURI (encodeURIComponent ('अपने स्ट्रिंग')));"

php या दृश्य पृष्ठ पर

आप

urldecode (urldecode (htmlspecialchars ('अपने एन्कोडेड स्ट्रिंग' निम्नलिखित की तरह डिकोड करने के लिए है , ENT_QUOTES))

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