使用 MVC 永久方式将 HTTP 重定向到 HTTPS 并为开发环境关闭
MVC Permanent way to use redirects for HTTP to HTTPS and turn off for Dev Environment
我从 here 那里得到了这段代码。
注意我删除了重定向到 ISSExpress 44300 端口的部分,因为我想在没有 https 的开发箱上使用 II7.5。
public class CustomRequireHttpsFilter : RequireHttpsAttribute
{
protected override void HandleNonHttpsRequest(AuthorizationContext filterContext)
{
// The base only redirects GET, but we added HEAD as well. This avoids exceptions for bots crawling using HEAD.
// The other requests will throw an exception to ensure the correct verbs are used.
// We fall back to the base method as the mvc exceptions are marked as internal.
if (!String.Equals(filterContext.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase)
&& !String.Equals(filterContext.HttpContext.Request.HttpMethod, "HEAD", StringComparison.OrdinalIgnoreCase))
{
base.HandleNonHttpsRequest(filterContext);
}
// Redirect to HTTPS version of page
// We updated this to redirect using 301 (permanent) instead of 302 (temporary).
string url = "https://" + filterContext.HttpContext.Request.Url.Host + filterContext.HttpContext.Request.RawUrl;
//if (string.Equals(filterContext.HttpContext.Request.Url.Host, "localhost", StringComparison.OrdinalIgnoreCase))
// {
// // For localhost requests, default to IISExpress https default port (44300)
// url = "https://" + filterContext.HttpContext.Request.Url.Host + ":44300" + filterContext.HttpContext.Request.RawUrl;
// }
filterContext.Result = new RedirectResult(url, true);
}
}
然后,在我的 FilterDonfig.cs 中添加了这个。它所做的是它仅在 Web.config 具有 "Debug=false" 时才使用上面的覆盖,这就是它在生产中所具有的。我不需要 运行 在我的开发环境中发布,我也不希望配置本地 IIS 来处理 SSL。请注意,我删除了 "RequireHttpsAttribute()" 并使用了上面的新内容。
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
if (!HttpContext.Current.IsDebuggingEnabled)
{
/////filters.Add(new RequireHttpsAttribute());
filters.Add(new CustomRequireHttpsFilter());
}
}
}
我做的对吗?这是如何确保 SEO 得到优化,因为搜索机器人只跟踪一个网站?我的理解是 "http" 和 "https" 被搜索引擎认为是两个独立的网站。我在正确的地方这样做吗?不确定还有哪些其他代码妨碍了我。
===============
我向我的 ISP 询问了如何进行永久重定向并提出了这个解决方案,他们说:
尊敬的客户,
我们没有设置重定向。但是,我们更正了 IIS 中的 https 绑定设置以解决该问题。
我想知道 IIS 是否可以做同样的事情,他们就是这样做的。我希望我在正确的论坛:)
如何使用 URL rewrite module: http://forums.iis.net/t/1153050.aspx?URL+Rewrite+for+SSL+redirection
在 IIS 级别执行此操作?
要在开发中关闭它,只需在您的开发中将启用规则设置为 false web.config,但为所有设置了 HTTPS 的 servers/environments 启用它。
我过去用过它,效果非常好。避免使用与应用程序无关的代码使您的应用程序变得混乱。
我从 here 那里得到了这段代码。
注意我删除了重定向到 ISSExpress 44300 端口的部分,因为我想在没有 https 的开发箱上使用 II7.5。
public class CustomRequireHttpsFilter : RequireHttpsAttribute
{
protected override void HandleNonHttpsRequest(AuthorizationContext filterContext)
{
// The base only redirects GET, but we added HEAD as well. This avoids exceptions for bots crawling using HEAD.
// The other requests will throw an exception to ensure the correct verbs are used.
// We fall back to the base method as the mvc exceptions are marked as internal.
if (!String.Equals(filterContext.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase)
&& !String.Equals(filterContext.HttpContext.Request.HttpMethod, "HEAD", StringComparison.OrdinalIgnoreCase))
{
base.HandleNonHttpsRequest(filterContext);
}
// Redirect to HTTPS version of page
// We updated this to redirect using 301 (permanent) instead of 302 (temporary).
string url = "https://" + filterContext.HttpContext.Request.Url.Host + filterContext.HttpContext.Request.RawUrl;
//if (string.Equals(filterContext.HttpContext.Request.Url.Host, "localhost", StringComparison.OrdinalIgnoreCase))
// {
// // For localhost requests, default to IISExpress https default port (44300)
// url = "https://" + filterContext.HttpContext.Request.Url.Host + ":44300" + filterContext.HttpContext.Request.RawUrl;
// }
filterContext.Result = new RedirectResult(url, true);
}
}
然后,在我的 FilterDonfig.cs 中添加了这个。它所做的是它仅在 Web.config 具有 "Debug=false" 时才使用上面的覆盖,这就是它在生产中所具有的。我不需要 运行 在我的开发环境中发布,我也不希望配置本地 IIS 来处理 SSL。请注意,我删除了 "RequireHttpsAttribute()" 并使用了上面的新内容。
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
if (!HttpContext.Current.IsDebuggingEnabled)
{
/////filters.Add(new RequireHttpsAttribute());
filters.Add(new CustomRequireHttpsFilter());
}
}
}
我做的对吗?这是如何确保 SEO 得到优化,因为搜索机器人只跟踪一个网站?我的理解是 "http" 和 "https" 被搜索引擎认为是两个独立的网站。我在正确的地方这样做吗?不确定还有哪些其他代码妨碍了我。
===============
我向我的 ISP 询问了如何进行永久重定向并提出了这个解决方案,他们说:
尊敬的客户, 我们没有设置重定向。但是,我们更正了 IIS 中的 https 绑定设置以解决该问题。
我想知道 IIS 是否可以做同样的事情,他们就是这样做的。我希望我在正确的论坛:)
如何使用 URL rewrite module: http://forums.iis.net/t/1153050.aspx?URL+Rewrite+for+SSL+redirection
在 IIS 级别执行此操作?要在开发中关闭它,只需在您的开发中将启用规则设置为 false web.config,但为所有设置了 HTTPS 的 servers/environments 启用它。
我过去用过它,效果非常好。避免使用与应用程序无关的代码使您的应用程序变得混乱。