मैं दो 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 और है कि फिल्टर फिर से हिट करता है, और इसी तरह।
क्या मैं याद कर रहा हूँ है? क्या यह कुछ आईआईएस सेटिंग है?
मुझे लगता है कि समस्या पुनर्लेखन नियम नहीं देखता अंतर ख है आने वाले http या https कॉल के बीच, इसलिए यह दोनों को वापस https पर फिर से लिख देगा। – Quintium
मेरा मानना है कि यह ठीक काम करता है, मैं HTTPS www.websitea.com/websiteb/index.html पर अनुरोध देख सकता हूं सही ढंग से HTTPS websiteb.com/index.html और HTTP पर HTTP; HttpContext.Current.Request पर IsSecureConnection प्रॉपर्टी सही/गलत सही पर सेट है। – patrykgliwinski
आह। समझा। मैंने उस हिस्से को गलत तरीके से पढ़ा। लेकिन यदि आप वेबसाइट लिखना चाहते हैं तो रीडाइटिट नियम में वेबसाइटब पर रीडायरेक्ट करना है, होना चाहिए? –
Quintium