使用阿里雲負載均衡遭遇的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); } }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM