पैरामीटर लंबाई> 255 वाले पुनर्विकसित URL काम नहीं करते हैं


12

मैं इस तरह यूआरएल को फिर से लिखने के लिए mod_rewrite का उपयोग कर रहा हूं:

http://example.com/1,2,3,4/foo/

ऐसा करने से .htaccess में:

RewriteEngine On
RewriteRule ^([\d,]+)/foo/$ /foo.php?id=$1 [L,QSA]

यह ठीक काम करता है, सिवाय इसके जब "1,2,3,4" 255 वर्णों से अधिक लंबे स्ट्रिंग में बदल जाता है, तो अपाचे "403 निषिद्ध" देता है।

foo.php?id=1,2,3,4बहुत लंबी आईडी स्ट्रिंग के साथ भी सीधे आने में कोई समस्या नहीं है , हालांकि यह मेरे लिए कोई विकल्प नहीं है।

क्या कुछ अपाचे या अन्य सेटिंग हैं जिन्हें मुझे ट्वीक करना चाहिए?

अद्यतन : मैंने RewriteLogLevel 9 के साथ RewriteLog चालू किया। एक छोटी आईडी स्ट्रिंग के साथ, मुझे अपनी लॉग फ़ाइल में कई पंक्तियाँ मिलती हैं। लेकिन जब आईडी स्ट्रिंग 255 से अधिक है।, कुछ भी लॉग नहीं किया गया है (ऐसा लगता है जैसे mod_rewrite भी निष्पादित नहीं कर रहा है?)।

यदि आपको यह प्रश्न रोचक / सहायक लगे, तो कृपया इसे लाइक करें।


यह एक regex समस्या हो सकती है? क्या आपने चेक किया है कि 255 अक्षरों से अधिक लंबे तार के लिए फिर से लिखा गया अनुरोध सही है? यदि नहीं, तो शायद आप पूर्व और बाद के अनुरोधों को फिर से लिख सकते हैं।
टोमजेड्रेज़

3
Mod_rewrite की लॉगिंग को सक्षम करें RewriteLogऔर RewriteLogLevelइसलिए आप देख सकते हैं कि क्या मिलान किया जा रहा है और यह वास्तव में कैसे लिखा जा रहा है। मुझे लगता है कि केवल 255 वर्णों की प्रतिलिपि बनाई जा रही है $1, और यह समाप्त हो रहा है idकि ग्राहक देखने के लिए अधिकृत नहीं है, इसलिए अपाचे 403 लौटाता है। मैंने कोड को नहीं देखा है, लेकिन यह हो सकता है कि अपाचे हेरफेर करता है एक निश्चित 256-बाइट बफर (256 वां समाप्त NULL के लिए आरक्षित है) में पश्चगामी।
जेम्स स्नेनर

प्रश्न में अद्यतन देखें - लंबे
पैरामेस के

जवाबों:


8

क्या आपको लगता है कि आप फ़ाइल सिस्टम की सीमा में चल रहे हैं?

हो सकता है कि अधिकतम फ़ाइल नाम की लंबाई 255 बाइट्स की हो और जब अपाचे या mod_rewrite नियम की जाँच करता है कि क्या फाइल मौजूद है तो ऑपरेटिंग सिस्टम द्वारा अपाचे में कोई त्रुटि दी गई है।

यदि आप अपनी .htaccess फ़ाइल में कुछ नियम रखते हैं, तो समस्या के आसपास काम करने में बहुत देर हो चुकी है। अपाचे ने पहले से ही फ़ाइल नाम को फेंकने की कोशिश की होगी और फाइल सिस्टम एरर '(36) फ़ाइल का नाम बहुत लंबा', 403% की गलती को वापस कर देगा।

शायद आप अपने ऐप के अंदर URL पैटर्न बदल सकते हैं। स्लैश से स्लैश तक अधिकतम 255 वर्ण।

संपादित करें: इस मुद्दे के विस्तृत जवाब के लिए यहां देखें । मैंने वहाँ से अपना ऋण लिया।


हां, वर्तमान में यह सब हम कर सकते हैं, मैं एक वैकल्पिक हल के लिए आशा कर रहा हूं या यद्यपि ट्वीक कर रहा हूं।
दार्शनिको

3
Microspino, ऐसा लगता है जैसे आपने @Jeff Clark के उत्तर से अपने उत्तर का हिस्सा काट दिया और चिपका दिया है: serverfault.com/questions/120397/… । आपको उस उत्तर के लिए हाइपरलिंक करना चाहिए, ताकि उसे कुछ बदनामी मिले।
स्टीफन लासिवस्की

@ सत्तेफैन लेज़स्विस्की: आप सही कह रहे हैं, मैंने एक संदर्भ जोड़ा।
microspino

इसलिए, आप सोच रहे हैं कि अपाचे ने अनुरोधित फ़ाइल को ध्यान से रखने की कोशिश की है - मेरा मतलब है, यह समझाने का एकमात्र तरीका हो सकता है कि बहुत लंबा URL भी फिर से लिखना इंजन द्वारा नहीं उठाया जा रहा है ...
HorusKol

हां, यह मेरा विचार है, हालांकि मुझे लगता है कि सामान्य तौर पर इतने सारे कारणों से लंबे समय तक यूआरएल और फाइलनेम से बचना चाहिए। तो सबसे अच्छी सलाह मुझे लगता है कि शायद URL पैटर्न में कुछ बदलना है अगर फ़ाइल नाम पहले से बहुत लंबा नहीं है।
माइक्रोस्पिनो

2

यहाँ इस सीमा के बारे में एक समान प्रश्न है :

आप अंतर्निहित फ़ाइल सिस्टम की सीमा में चल सकते हैं

मुझे नहीं पता कि आप REQUEST_FILENAME का उपयोग कहीं और कर रहे हैं या नहीं .htaccess कॉन्फ़िगरेशन, इसलिए यह नहीं जानते कि क्या प्रदान किया गया समाधान काम करने वाला है।


यह समझ में आता है, लेकिन नहीं, मैं नहीं हूँ। मैंने अपने प्रश्न को .htaccess फ़ाइल को संपूर्णता में शामिल करने के लिए संपादित किया। अन्य विचार?
फिल्पेरो

Httpd.apache.org/docs/trunk/rewrite/tech.html पर "अपाचे mod_rewrite टेक्निकल डिटेल्स" के अनुसार, हालांकि mod_rewrite URLs से URL, URL से फाइलनाम और यहां तक ​​कि फ़ाइल नाम के लिए URL को फिर से लिखता है, API वर्तमान में केवल URL-प्रदान करता है -फिलनेम हुक। " तो भले ही आप एक वास्तविक फ़ाइल नहीं मार रहे हों, हो सकता है कि हुक का फ़ाइल नाम OS संसाधन की सीमा से टकरा रहा हो?
स्टीफन लासिवस्की

0

निश्चित रूप से एक दिलचस्प सवाल है। क्या आप mod_security चलाते हैं और यदि हां, तो इसके बिना कोशिश की गई है? शायद यह लंबे पथ के नाम या लंबे मार्ग के नामों को पसंद नहीं करता है, जिसमें अनकैप्ड कॉमा है? ^^

हालांकि यह सहज रूप से url पथ की सीमा या इसके कम से कम अलग-अलग खंडों या अंतर्निहित फाइल सिस्टम की व्याख्या की तरह अधिक महसूस करता है जैसा कि GmonC ने लिखा है। यह भी बताएगा कि क्वेरी स्ट्रिंग में लंबे भाग के साथ नियमित url ठीक क्यों काम करता है।

मुझे लगता है कि पुराने ASP.NET के पास ~ 260 अक्षरों या कुछ के साथ-साथ अनुरोध पथ की सीमा होती थी।


प्रश्न के लिए अद्यतन देखें। और नहीं, मैं में एक mod_security फ़ाइल नहीं दिख रहा है /usr/include/apache2/या /usr/lib/apache2/modules/(लेकिन मैं mod_rewrite वहाँ क्यों दिखाई देता है) तो मैं यह सोचते हैं रहा हूँ यह इंस्टॉल नहीं है।
फिल्पेरो

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.