我想强制 HTTP 客户端在我的应用程序中切换到 HTTPS。用户键入www.mysite.com
将默认使用 HTTP,但他们需要重定向到 HTTPS。使用旧书签的用户将被重定向到书签页面的 HTTPS 版本。
HSTS (RFC 6797) 一旦被重定向就会有很大帮助。我的问题实际上是关于 HTTP 方法的。
GET
并且HEAD
肯定应该接受 301/302 重定向,但是POST
/PUT
和DELETE
呢?
请参见以下示例:
void context_BeginRequest(object sender, EventArgs e)
{
HttpApplication application = (HttpApplication)sender;
HttpContext context = application.Context;
if (context.Request.IsSecureConnection) return;
if (context.Request.HttpMethod == "GET" || context.Request.HttpMethod == "HEAD")
{
string redirectUri = context.Request.Url.ToString().Replace("http://", "https://");
context.Response.RedirectPermanent(redirectUri, true);
}
else
{
throw new HttpException(403, "SSL Required");
}
}
GET 和 HEAD 都通过重定向处理。目前 POST,据我所知,接受 301 重定向作为要完成的 GET 请求,即不会重新发布到 HTTPS 版本。所以这就是为什么在我的代码片段中我最终得到一个 403 代码。
问题是从 HTTP 协议的角度来阅读
除了检查应用程序中的所有表单是否指向 HTTPS,聪明的 HTTP 开发人员应该如何在浏览器将请求定向到普通的旧 HTTP 版本时强制客户端将 POST 请求重定向到页面的 HTTPS 版本?
可能的解决方案
创建一个包含所有表单字段的登录页面,该页面会自动(通过 Javascript 和“如果您没有被重定向,请点击我”按钮)将表单重新发布到目标页面的 HTTPS 版本。
还有其他想法吗?