2016-02-17 11 views
9

मैं दो IIS वेबसाइटें एक ही आईआईएस सर्वर पर की स्थापना की है। वेबसाइट ए में अधिकांश सामग्री शामिल है और हमारे पते का अनुरोध करते समय उपयोगकर्ताओं को दिखाया जाता है (उदा। Www.websitea.com)। वेबसाइट बी एक अलग परियोजना है जिसमें पूरी सामग्री का केवल एक हिस्सा शामिल है, इसलिए यह आंतरिक है (आईआईएस में वेबसाइटबॉट में बाध्य है), लेकिन एक यूआरएल रिवाइट के माध्यम से, उपयोगकर्ता www.websitea.com/websiteb टाइप करके इसे प्राप्त कर सकते हैं ।प्रतिक्रिया हेडर में HTTPS करने के लिए HTTP (सी #, आईआईएस) रीडायरेक्ट करने के लिए कोशिश कर रहा है, लेकिन HTTPS मुड़ता वापस HTTP के लिए - रीडायरेक्ट लूप

URL रीराइट वेबसाइट एक के web.config में इस तरह दिखता है:

<rewrite> 
    <rules> 
    <clear /> 
    <rule name="Website B rewrite rule" stopProcessing="true"> 
     <match url="^websiteb(.*)" /> 
     <conditions logicalGrouping="MatchAll" trackAllCaptures="false"> 
     <add input="{CACHE_URL}" pattern="^(https?)://" /> 
     </conditions> 
     <action type="Rewrite" url="{C:1}://websiteb.com{R:1}" /> 
    </rule> 
    </rules> 
</rewrite> 

{CACHE_URL} और {सी: 1} बिट्स इस्तेमाल किया प्रोटोकॉल रखने के लिए कर रहे हैं। जैसे एक उपयोगकर्ता HTTP पर www.websitea.com/websiteb/foo.html का अनुरोध "फिर से लिखा" हो जाता है HTTP पर websiteb.com/foo.html के लिए, और एक अनुरोध HTTPS पर websitea.com/websiteb/bar.html को जाता है "फिर से लिखा" HTTPS पर websiteb.com/bar.html पर। यह हमारी SomePageViewModel के ShouldBeHttps संपत्ति में सेट है -

अब, कुछ वेबसाइट बी पृष्ठों के लिए हम उपयोगकर्ता को केवल HTTPS का उपयोग करना चाहते हैं। तो निम्न कोड एक ActionFilterAttribute में प्रयोग किया जाता है:

public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     if (filterContext.HttpContext.Request.IsSecureConnection) 
      return; 

     var result = filterContext.Result as ViewResult; 
     if (result != null) 
     { 
      if ((result.Model as SomePageViewModel).ShouldBeHttps) 
      { 
       HandleNonHttpsRequest(filterContext); 
      } 
     } 
    } 

    protected virtual void HandleNonHttpsRequest(ActionExecutedContext filterContext) 
    { 
     if (!string.Equals(filterContext.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase)) 
      throw new InvalidOperationException("The method must be a GET"); 
     string url = filterContext.HttpContext.Request.Url.ToString().Replace("http:", "https:"); 
     filterContext.Result = new RedirectResult(url); 
    } 

मान लीजिए कि www.websitea.com/websiteb/securepage.html ShouldBeHttps संपत्ति में एक सही मूल्य में परिणाम होगा करते हैं।

अब, जब मैं HTTP पर websiteb.com/securepage.html पर जाकर सीधे सर्वर पर इसका परीक्षण करता हूं, तो मुझे HTTPS पर websiteb.com/securepage.html पर सही ढंग से पुनर्निर्देशित (स्थिति कोड 302) मिलता है।

मुझे उम्मीद है कि जब मैं HTTP पर www.websitea.com/websiteb/securepage.html पर जाता हूं, तो मुझे HTTPS पर www.websitea.com/websiteb/securepage.html पर रीडायरेक्ट कर दिया जाएगा। हालांकि, मेरे ब्राउज़र एक रीडायरेक्ट लूप (ERR_TOO_MANY_REDIRECTS) में समाप्त होते हैं। मैं TextView टैब में फ़िडलर में देख सकते हैं कि यह ठीक से सेट किया जा रहा है:

<html> 
<head> 
    <title>Object moved</title> 
</head> 
<body> 
<h2>Object moved to <a href="https://www.websitea.com/websiteb/securepage.html">here</a>.</h2> 
</body> 
</html> 

लेकिन हेडर टैब दिखाता है:

Response Headers 
HTTP/1.1 302 Found 
(...) 
Transport 
    Location: http://www.websitea.com/websiteb/securepage.html 

बजाय https में जाने का, इसे फिर से है http और है कि फिल्टर फिर से हिट करता है, और इसी तरह।

क्या मैं याद कर रहा हूँ है? क्या यह कुछ आईआईएस सेटिंग है?

+0

मुझे लगता है कि समस्या पुनर्लेखन नियम नहीं देखता अंतर ख है आने वाले http या https कॉल के बीच, इसलिए यह दोनों को वापस https पर फिर से लिख देगा। – Quintium

+0

मेरा मानना ​​है कि यह ठीक काम करता है, मैं HTTPS www.websitea.com/websiteb/index.html पर अनुरोध देख सकता हूं सही ढंग से HTTPS websiteb.com/index.html और HTTP पर HTTP; HttpContext.Current.Request पर IsSecureConnection प्रॉपर्टी सही/गलत सही पर सेट है। – patrykgliwinski

+0

आह। समझा। मैंने उस हिस्से को गलत तरीके से पढ़ा। लेकिन यदि आप वेबसाइट लिखना चाहते हैं तो रीडाइटिट नियम में वेबसाइटब पर रीडायरेक्ट करना है, होना चाहिए? – Quintium

उत्तर

-1

इस config की कोशिश करो। मेरी वेबसाइट

<rule name="Redirect to HTTPS" stopProcessing="true"> 
<match url="(.*)" /> 
<conditions><add input="{HTTPS}" pattern="^OFF$" /> 
</conditions> 
<action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="SeeOther" /> 
</rule> 
+0

नहीं, नहीं, मुझे उस समस्या का उपयोग करने की आवश्यकता है, जो कि चाहिए, जिसे "गणना" सर्वर-साइड रीराइट करने के बाद ही किया जाता है, इसलिए मैं "हार्ड-कोड" नहीं कर सकता "पुनर्लेखन कार्रवाई में https। – patrykgliwinski

-1

यह ज्यादातर आईआईएस

में एक बग है के लिए काम करता है 1.Disable URL पुनर्लेखन कैश

2.Add अपने नियम

3 करने के लिए एक "असुरक्षित" चर।

x64

x86: अपने कैश

और सबसे अच्छा तरीका है, पुनर्लेखन

का उपयोग किए बिना साफ़ करता है, तो आप कोड में यह कर सकते हैं किस संस्करण आईआईएस के प्रयोग पर निर्भर करता है, यह आपके बग को ठीक कर सकता है

KB2974666

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