दिलचस्प पोस्ट
एंड्रॉइड स्टूडियो ट्रांसफ़ॉर्म एक्सपैशन: त्रुटि: कार्य के लिए निष्पादन विफल ': एप: ट्रांसफ़ॉर्म क्लासेसहैडडेक्सफ़ोर्डडब्यूब' यूआरएल को एक एचटीएल पृष्ठ से एसएडी या एजेक के उपयोग से निकालने का सबसे आसान तरीका JQuery का उपयोग करते हुए फ़ंक्शन में डेटा $ लौटें एक कदम affine एक बिंदु के आसपास रोटेशन के लिए परिणत? एंड्रॉइड पर URL से यूआरएल से सरल पार्स और लिस्ट्यूव्यू में डिस्प्ले ऑटो लेआउट UIScrollView गतिशील ऊंचाइयों के साथ subviews के साथ जब एक अभियुक्त विफल हो जाता है, तो पायथन की एकजुटता में जारी रहना Ggplot2 में रंग भरने के लिए बनावट कैसे जोड़ें? पाठ के इनपुट के साथ jQuery का Datepicker जो उपयोगकर्ता इनपुट की अनुमति नहीं देता है वेबएपीआई में लंबे समय से चल रहे कार्य जांचें कि पंक्ति mysql के साथ मौजूद है या नहीं चलती प्रक्रिया को देखने के लिए बाश स्क्रिप्ट एंड्रॉइड: दृश्य शैली को प्रोग्राम के अनुसार सेट करें ActionBar (Android) में बटन कैसे जोड़ें? 2 डी टक्कर का पता लगाने के लिए क्वाटट्री

ASP.NET MVC, यूआरएल रूटिंग: अधिकतम पथ (यूआरएल) की लंबाई

परिदृश्य

मेरे पास एक आवेदन है जहां हमने अच्छी पुरानी क्वेरी स्ट्रिंग यूआरएल संरचना ली है:

?x=1&y=2&z=3&a=4&b=5&c=6 

और इसे एक पथ संरचना में बदल दिया:

 /x/1/y/2/z/3/a/4/b/5/c/6 

हम एएसपी.नेट एमवीसी और (स्वाभाविक रूप से) एएसपीएनईटी रूटिंग का उपयोग कर रहे हैं।

समस्या

समस्या यह है कि हमारे पैरामीटर गतिशील हैं, और (सैद्धांतिक रूप से) पैरामीटर्स की मात्रा के लिए कोई सीमा नहीं है जिसे हमें इसके लिए समायोजित करने की आवश्यकता है।

जब तक हम निम्नलिखित ट्रेन से हिट नहीं हो जाते, यह सब ठीक है:

HTTP त्रुटि 400.0 – गलत अनुरोध ASP.NET ने URL में अमान्य वर्णों का पता लगाया है।

आईआईएस इस त्रुटि को फेंक देगा जब हमारी यूआरएल एक निश्चित लंबाई से गुजरती है।

एक पदार्थ का मौलिक तत्व

यहां बताया गया है:

यह एक आईआईएस समस्या नहीं है

आईआईएस में अधिकतम पथ लंबाई सीमा है, लेकिन उपरोक्त त्रुटि यह नहीं है।

सीखें डॉट आईआईएस डॉट नेट अनुरोध फ़िल्टरिंग अनुभाग का उपयोग कैसे करें "अनुरोध सीमा के आधार पर फ़िल्टर करें"

यदि पथ आईआईएस के लिए बहुत लंबा था, तो यह एक 404.14, 400.0 नहीं होगा।

इसके अलावा, IIS अधिकतम पथ (और क्वेरी) लंबाई विन्यास योग्य है:

 <requestLimits maxAllowedContentLength="30000000" maxUrl="260" maxQueryString="25" /> 

यह एक asp.net समस्या है

कुछ घूमने के बाद:

आईआईएस फोरम धागा: ASP.NET 2.0 अधिकतम यूआरएल लंबाई? http://forums.iis.net/t/1105360.aspx

यह पता चला है कि यह एक asp.net (अच्छी तरह से, .net वास्तव में) समस्या है।

इस मामले का दिल यह है कि, जहाँ तक मैं बता सकता हूं, एएसपी.एन.टी. 260 अक्षरों से अधिक समय तक पथ को नियंत्रित नहीं कर सकता।

ताबूत में नाखूनों की पुष्टि की है कि फिल की हाक ने स्वयं पुष्टि की है:

स्टैक अतिप्रवाह ASP.NET यूआरएल MAX_PATH सीमा प्रश्न आईडी 265251

प्रश्न

तो सवाल क्या है?

सवाल यह है, यह कितना बड़ा है?

मेरे ऐप के लिए, यह एक सौदा हत्यारा है अधिकतर ऐप्स के लिए, यह शायद एक गैर-मुद्दा है

प्रकटीकरण के बारे में क्या? नहीं, जहां एएसपी.नेट रूटिंग का उल्लेख किया गया है मैंने कभी इस सीमा के बारे में एक झलक सुना है। तथ्य यह है कि एएसपी.नेट एमवीसीएएस एएसपी.एन.टी.नेट का इस्तेमाल करता है, इससे भी बड़ा प्रभाव पड़ता है।

तुम क्या सोचते हो?

Solutions Collecting From Web of "ASP.NET MVC, यूआरएल रूटिंग: अधिकतम पथ (यूआरएल) की लंबाई"

मैं वेब पर निम्न का उपयोग कर समाप्त हो गया। Config को Mvc2 और .Net Framework 4.0 का उपयोग कर इस समस्या को हल करने के लिए

 <httpRuntime maxUrlLength="1000" relaxedUrlToFileSystemMapping="true" /> 

इसे हल करने के लिए, यह करें:

सिस्टम.वेब नोड के तहत, आपके प्रोजेक्ट के रूट वेब। कॉन्फ़िग में:

 <system.web> <httpRuntime maxUrlLength="10999" maxQueryStringLength="2097151" /> ... 

इसके अलावा, मुझे इसे सिस्टम के अंतर्गत जोड़ना पड़ा। वेबसर्वर नोड या मेरे लंबे क्वेरी स्ट्रिंग के लिए मुझे सुरक्षा त्रुटि मिली:

 <system.webServer> <security> <requestFiltering> <requestLimits maxUrl="10999" maxQueryString="2097151" /> </requestFiltering> </security> ... 

Http.sys सेवा डिफ़ॉल्ट रूप से प्रति यूआरएल खंड में अधिकतम 260 वर्णों के साथ कोडित है।

इस संदर्भ में एक "यूआरएल सेगमेंट" यूआरएल में "/" के बीच की कंटेंट है उदाहरण के लिए:

 http://www.example.com/segment-one/segment-two/segment-three 

अधिकतम स्वीकृत यूआरएल सेगमेंट लंबाई को रजिस्ट्री सेटिंग्स के साथ बदला जा सकता है:

  • कुंजी: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\HTTP\Parameters
  • मान: UrlSegmentMaxLength
  • प्रकार: REG_DWORD
  • डेटा: (आपका वांछित नए यूआरएल सेगमेंट अधिकतम अनुमत लंबाई, जैसे 4096)

Http.sys सेटिंग्स के बारे में अधिक: http://support.microsoft.com/kb/820129

अधिकतम अनुमत मूल्य 32766 है। यदि कोई बड़ा मान निर्दिष्ट है, तो इसकी अनदेखी की जाएगी। (क्रेडिट: जुआन मेन्डस)

इस सेटिंग में परिवर्तन करने के लिए पीसी को पुनरारंभ करना आवश्यक है। (क्रेडिट: डेविड रेटेनबेकर, जुआन मेन्डस)

ठीक है, मैंने जिस कारण का पोस्ट किया है उसका भी यही कारण था क्योंकि हमें आसपास काम मिल गया है।

मुझे उम्मीद है कि यह भविष्य में किसी के लिए उपयोगी होगा: डी

समाधान

समाधान काफी आसान है, और यह बहुत अच्छा भी है।

चूंकि हम जानते हैं कि साइट के किन भागों को गतिशील मापदंडों (और इसलिए एक गतिशील पथ और लम्बाई) का उपयोग करने की आवश्यकता होगी, हम एएसपी.नेट रूटिंग से पहले इसे अवरुद्ध करके इसे लंबे समय तक एएसपीएनईटी रूटिंग में भेजने से बच सकते हैं।

आईआईएस 7 यूआरएल आरईआरईटिंग (या किसी समकक्ष पुन: लिखना मॉड्यूल) दर्ज करें

हम इस तरह एक नियम बनाते हैं:

  <rewrite> <rules> <rule> <rule name="Remove Category Request Parameters From Url"> <match url="^category/(\d+)/{0,1}(.*)$" /> <action type="Rewrite" url="category/{R:1}" /> </rule> </rules> </rewrite> 

असल में, हम जो कर रहे हैं वह सही मार्ग को डाउनस्ट्रीम को सही कॉल करने में सक्षम होने के लिए पर्याप्त रूप से रखते हैं। बाकी यूआरएल पथ हम बंद हैंकिंग कर रहे हैं

बाकी यूआरएल कहां जाता है?

ठीक है, जब एक पुनर्लेखन नियम निकाल दिया जाता है, IIS7 यूआरएल रीराइट मॉड्यूल स्वचालित रूप से अनुरोध में इस हैडर को सेट करता है:

 HTTP_X_ORIGINAL_URL 

डाउनस्ट्रीम, उस ऐप के भाग में, जिस पर पथ को देखने के बजाय गतिशील पथ को पार्स करता है:

 HttpContext.Request.Url.PathAndQuery 

हम इसके बजाय उस शीर्षलेख को देखें:

 HttpContext.Request.ServerVariables["HTTP_X_ORIGINAL_URL"] 

समस्या हल हो गई … लगभग!

स्नैग्स

हेडर तक पहुंच

यदि आप को पता होना चाहिए, IIS7 पुनर्लेखन मॉड्यूल हेडर तक पहुंचने के लिए, आप ऐसा दो तरह से कर सकते हैं:

 HttpContext.Request.ServerVariables["HTTP_X_ORIGINAL_URL"] 

या

 HttpContext.Request.Headers["X-ORIGINAL-URL"] 

सापेक्ष पथ तय करना

आप यह भी देखेंगे कि, उपरोक्त सेटअप के साथ, सभी सापेक्ष पथ तोड़ते हैं (यूआरएल जो "~" के साथ परिभाषित होते थे)।

इसमें ASP.NET MVC HtmlHelper और Url.Route("Bla") विधियों (जैसे Url.Route("Bla") साथ परिभाषित URL शामिल हैं)।

यह वह जगह है जहां ASP.NET MVC कोड तक पहुंच शानदार है।

System.Web.Mvc.PathHelper.GenerateClientUrlInternal() विधि में, यह देखने के लिए एक चेक किया जा रहा है कि क्या उसी URL को फिर से लिखना मॉड्यूल शीर्षलेख मौजूद है (ऊपर देखें):

 // we only want to manipulate the path if URL rewriting is active, else we risk breaking the generated URL NameValueCollection serverVars = httpContext.Request.ServerVariables; bool urlRewriterIsEnabled = (serverVars != null && serverVars[_urlRewriterServerVar] != null); if (!urlRewriterIsEnabled) { return contentPath; } 

यदि ऐसा होता है, तो कुछ काम मूल URL को संरक्षित करने के लिए किया जाता है

हमारे मामले में, चूंकि हम "सामान्य" तरीके से यूआरएल पुन: लिखना का उपयोग नहीं कर रहे हैं, हम इस प्रक्रिया को शॉर्ट सर्किट करना चाहते हैं।

हम कोई यूआरएल के नए सिरे से लिखने का नाटक करना चाहते हैं क्योंकि हम नहीं चाहते कि सापेक्ष पथ मूल यूआरएल के संदर्भ में विचार किए जाएं।

सबसे सरल हैक जो मैं सोच सकता था वह उस सर्वर चर को पूरी तरह से दूर करना था, इसलिए एएसपी.नेट एमवीसी इसे नहीं खोज पाएगा:

 protected void Application_BeginRequest() { string iis7UrlRewriteServerVariable = "HTTP_X_ORIGINAL_URL"; string headerValue = Request.ServerVariables[iis7UrlRewriteServerVariable]; if (String.IsNullOrEmpty(headerValue) == false) { Request.ServerVariables.Remove(iis7UrlRewriteServerVariable); Context.Items.Add(iis7UrlRewriteServerVariable, headerValue); } } 

(ध्यान दें कि, उपर्युक्त विधि में, मैं अनुरोध से हैडर को निकाल रहा हूं। Request.ServerVariables परन्तु अब भी इसे बनाए रखना, इसे संदर्भ में Context.ItemsContext.Items । इसका कारण यह है कि मुझे बाद में अनुरोध पाइप में हैडर मान तक पहुंच की आवश्यकता है ।)

उम्मीद है की यह मदद करेगा!

मुझे लगता है कि आप GET का उपयोग करने के लिए कड़ी मेहनत कर रहे हैं अनुरोध विधि को पोस्ट करने और उन क्वेरी स्ट्रिंग पैरामीटर को अनुरोध निकाय में डाल करने का प्रयास करें।

लंबा यूआरएल एसईओ के रूप में अच्छी तरह से मदद नहीं करता है, यह करता है?

शायद अब कोई फर्क नहीं पड़ता … लेकिन यह मेरे लिए काम किया (क्योंकि मैं एएसपीएक्स फाइलों का उपयोग नहीं कर रहा था, और मुझे अनुमान लगाया जाएगा कि यह एमवीसी के लिए काम करेगा):

http://blogs.iis.net/rakkimk/archive/2008/10/10/asp-net-2-0-x64-you-may-get-http-400-bad-request-or-error-as- उल्लेख-इन-केबी-932,552 या 826437.aspx

ऐसा लगता है कि हार्ड-कोडित अधिकतम URL लंबाई को .NET 4.0 में ठीक किया गया है । विशेष रूप से, यहां एक वेब। web.config अनुभाग है:

 <httpRuntime maxRequestPathLength="260" maxQueryStringLength="2048" /> 

कि आप अनुमति दी यूआरएल की सीमा का विस्तार