zoukankan      html  css  js  c++  java
  • 使用阿里云负载均衡遭遇的http重定向https的问题

    昨天解决了在阿里云负载均衡上部署https证书的问题(详见一个空行引起的阿里云负载均衡上部署https证书的问题),并完成了部署,负载均衡的监听配置是这样的:

    用户与负载均衡之间走https协议,负载均衡与后端服务器之间走http协议,这样的好处之一是后端服务器不用一台台安装证书了。

    今天早上准备实现当用户以http访问站点时自动跳转为https访问,于是想当然地在后端web服务器中添加了一条如下的URL重写规则(IIS URL Rewrite Module):

    <rewrite>
        <rules>
            <rule name="redirect_http_to_https" stopProcessing="true">
                <match url="^$" />
                <conditions>
                    <add input="{HTTPS}" pattern="^OFF$" />
                    <add input="{REMOTE_ADDR}" pattern="^127.0.0.1$" negate="true" />
                </conditions>
                <action type="Redirect" url="https://{HTTP_HOST}/" redirectType="Temporary" />
            </rule>
        </rules>
    </rewrite>

    结果http的确跳转为https,但是直接以https访问,Chrome浏览器却出现“Redirect too many times”的错误,https访问竟然也会跳转,怎么回事?

    停下来一想,立马恍然大悟:自己早上还没睡醒,忘了负载均衡与后端服务器之间始终走的是http协议,不管用户是http访问还是https访问,后端服务器收到的都是http请求,在后端服务器上根本区分不出用户用的是http还是https,根本无法通过上面的URL重写实现。

    向阿里云反馈这个情况,从客服那得到的一个解决方法是在后端服务器上也部署https证书,让负载均衡与后端服务器之间也走https协议。

    在众多后端服务器上一台台部署证书,好麻烦;仅仅为了重定向而让负载均衡与后端服务器的通信协议由http改为https,好浪费。最经济环保的解决方法是负载均衡直接支持URL重写,我只需在负载均衡控制台添加一条URL重写规则。已经向阿里云提出了建议,希望能尽早实现。

    更新:后来阿里云实现了:“通过X-Forwarded-Proto头字段获取SLB的监听协议”

    在ASP.NET Core中的实现代码如下:

    public class RedirectToProxiedHttpsRule : RedirectToHttpsRule
    {
        public RedirectToProxiedHttpsRule()
        {
            base.StatusCode = StatusCodes.Status301MovedPermanently;
            base.SSLPort = null;
        }
        public override void ApplyRule(RewriteContext context)
        {
            var key = "X-Forwarded-Proto";
            var request = context.HttpContext.Request;
            if (request.Headers.ContainsKey(key))
            {
                if (request.Headers[key].FirstOrDefault() == "http")
                {
                    base.ApplyRule(context);
                }
            }            
        }       
    }
    public class Startup { public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { var rewriteOptions = new RewriteOptions(); rewriteOptions.Rules.Add(new RedirectToProxiedHttpsRule()); app.UseRewriter(rewriteOptions); } }
  • 相关阅读:
    Benchmark Web App 性能瓶颈分析与性能测试工具的使用方法总结
    如何永久删除git仓库中敏感文件的提交记录
    javascript中的this在不同场景下的区别
    利用jsPDF有效减轻报表型应用服务器的IO负载
    nginx与apache的参考配置
    统计学中相关数学符号、希腊字母的标准读法
    C++的子类与父类强制转换产生的问题
    获得潜在新用户联系方式的妙招
    团队工作效率分析工具gitstats
    你被R语言的=和<-搞昏了头吗
  • 原文地址:https://www.cnblogs.com/dudu/p/5714328.html
Copyright © 2011-2022 走看看