2011-12-15 15 views
8

हमारे पास नियंत्रक पर RequHTTPS विशेषता का उपयोग करके एक एएसपी.Net MVC3 साइट केवल HTTPS पर पहुंच योग्य है।HTTPS पर HTTP HEAD अनुरोध के लिए सही प्रतिक्रिया केवल

हमें कई HTTP HEAD विधि अनुरोध प्राप्त हो रहे हैं, मुख्य रूप से ट्विटर बॉट्स के रूप में दिखाई देने वाले। डिफ़ॉल्ट ASP.Net/MVC3 प्रतिक्रिया एक '500 आंतरिक सर्वर त्रुटि' है, और elmah और log4net द्वारा पकड़ा/लॉग किया जा रहा है (अब फ़िल्टर किया गया है!)।

मैं इस प्रश्न के अनुसार इन गैर-HTTPS अनुरोधों को संभालने के लिए एक विशिष्ट नियंत्रक और मार्ग लिख सकता हूं - Responding to HEAD Request in asp.NET MVC 3

लेकिन, बॉट्स परिप्रेक्ष्य से सबसे अच्छी प्रतिक्रिया क्या होगी? सर्वर को दिखाने के लिए 200 जीवित है, 302 एचटीटीपीएस यूआरएल पर रीडायरेक्ट है, या 500 के साथ चिपक गया है क्योंकि साइट HTTP पर उपलब्ध नहीं है?

+0

500 सही नहीं लगता है ... नहीं है इसके लिए एक स्टेटस कोड है? 500 सुझाव देता है कि वास्तव में कहीं एक त्रुटि है। –

+1

मेरा सुझाव है कि 500 ​​त्रुटि फेंक न दें। यदि साइट केवल HTTPS के माध्यम से पहुंच योग्य है। मैं 302 (अस्थायी) के बजाय 301 रीडायरेक्ट (स्थायी) का उपयोग करूंगा। आप समस्या को सुलझाने के लिए सभी गैर-https ट्रैफ़िक को पुनर्निर्देशित करने के लिए पुनर्लेखन नियम का भी उपयोग कर सकते हैं। –

+0

500 त्रुटि फेंकने के बारे में सहमत नहीं है, लेकिन यह एमवीसी 3 का डिफ़ॉल्ट व्यवहार है: 'System.InvalidOperationException: अनुरोधित संसाधन केवल एसएसएल के माध्यम से पहुंचा जा सकता है। System.Web.Mvc.RequireHttpsAttribute.HandleNonHttpsRequest (AuthorizationContext filterContext) System.Web.Mvc.RequireHttpsAttribute.OnAuthorization (AuthorizationContext filterContext) पर System.Web.Mvc.ControllerActionInvoker.InvokeAuthorizationFilters पर (ControllerContext controllerContext, IList'1 फिल्टर पर, एक्शन डिस्क्रिप्टर एक्शन डिस्क्रिप्टर) – Chris

उत्तर

5

आप

405 Method Not Allowed 

के साथ प्रतिक्रिया कर सकता है जिसका मतलब है

विधि अनुरोध लाइन में निर्दिष्ट संसाधन अनुरोध- URI द्वारा की पहचान के लिए अनुमति नहीं है। प्रतिक्रिया में अनुरोध किए गए संसाधन के लिए वैध विधियों की एक सूची वाले हेडर को अनुमति दें।

या

501 Not Implemented 

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

व्यक्तिगत रूप से, मैं 405 साथ के बाद से यह क्लाइंट की तरफ कोई त्रुटि है जाना जाता था, एक "अरे यार, हम उस सामग्री यहां की सेवा नहीं है।"से अधिक मेरे लिए उपयुक्त लगता है "आप किस बारे में बात कर रहे हैं? मुझे समझ में नहीं आ रहा है।" एक, बाद में द्वारा सुझाया गया है, सर्वर विवरण के अनुरोध विधि बिट को पहचान नहीं करता है।

सभी HTTP स्थिति कोड: http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html साइट / जो जांच बॉट की तरह लगता है की जड़ पर

1

मेरे मामले में, मैं केवल हो रही थी HEAD अनुरोध। तो, मैं 500 या 404 लौटने के बारे में थोड़ा चिंतित था।

405 पर अधिक एल्बिरेओ के जवाब के अनुसार ठीक हो सकता है, लेकिन आप स्वीकार क्रियाओं वापस जाने के लिए की जरूरत है की तरह कुछ: खोज रहे हैं

// 405 must include allowable methods. 
// https://tools.ietf.org/html/rfc2616#section-14.7 
httpContext.Response.StatusCode = (int)HttpStatusCode.MethodNotAllowed; 
httpContext.Response.AddHeader("Allow", "GET"); 

302 विकल्प

एमवीसी कोड में टिप्पणी पर जो HEAD अनुरोध को पुनर्निर्देशित नहीं करता है:

//only redirect for GET requests, otherwise the browser might not propagate the verb and request 
//body correctly. 

ऐसा लगता है कि एक और विकल्प 302 भेजना है। यह रूट करने के लिए बीओटी हेड अनुरोधों के लिए एचटीटीपीएस साइट पर 302 को वापस करने के लिए उचित रूप से सुरक्षित होना चाहिए (जो एमईसी जीईटी के लिए करता है)।

if(isHead == true && isRoot == true) 
{ 
    httpContext.ClearError(); 
    httpContext.Response.Clear();      
    httpContext.Response.StatusCode = 302; 
    string url = "https://" + httpContext.Request.Url.Host + httpContext.Request.RawUrl; 
    httpContext.Response.Redirect(url, endResponse: false);      
    return; 
} 

global.asax.cs में लागू: तो, मैं जिसके बाद जिस तरह से MVC यह होता है कि पर आधारित है कार्यान्वित

protected void Application_Error(object sender, EventArgs e) 
{ 
    //Your code here 
} 
संबंधित मुद्दे