将 HTTP 请求重定向到 HTTPS

以下示例展示了如何使用网址映射重定向将所有请求从 HTTP 重定向到 HTTPS。以下示例展示了如何使用众所周知的端口 80(对于 HTTP)和 443(对于 HTTPS)来设置重定向。但是,您不需要使用这些特定的端口号。应用负载均衡器的每个转发规则可以引用 1-65535 中的单个端口

HTTPS 使用 TLS (SSL) 来加密 HTTP 请求和响应,使其更安全。使用 HTTPS 的网站在其网址开头使用 https://,而不是 http://

对于新的 HTTPS 应用负载均衡器

如果您要创建新的 HTTPS 应用负载均衡器,可以使用 Google Cloud 控制台设置从 HTTP 到 HTTPS 的重定向。

创建负载均衡器的前端时,请按以下步骤操作:

  1. 在 Google Cloud 控制台中,转到负载均衡器的配置页面。

    打开“负载均衡”(创建全球外部应用负载均衡器)

  2. 负载均衡器名称部分,输入名称。
  3. 点击前端配置
  4. 协议部分,选择 HTTPS(包括 HTTP/2)
  5. IP 地址部分,点击创建 IP 地址。输入新静态 IP 地址的名称,然后点击预留
  6. 证书部分,选择 SSL 证书。
  7. 如需创建重定向,请选中启用从 HTTP 到 HTTPS 的重定向复选框。
  8. 点击完成
  9. 完成后端和其他所需配置。
  10. 点击创建

请注意,您必须选择 HTTPS 协议并使用预留的 IP 地址(非临时地址)才能选中该复选框。

Google Cloud 控制台中的 HTTP 到 HTTPS 重定向复选框。
图 1.Google Cloud 控制台中的 HTTP 到 HTTPS 重定向复选框(点击可放大)。

根据后端类型,使用以下某个指南中的 Google Cloud 控制台说明来完成此设置:

设置启用从 HTTP 到 HTTPS 的重定向复选框会自动创建一个额外的部分 HTTP 负载均衡器,它由网址映射、转发规则和目标 HTTP 代理组成。此部分 HTTP 负载均衡器使用与 HTTPS 负载均衡器相同的 IP 地址,并将 HTTP 请求重定向到您的负载均衡器的 HTTPS 前端。它使用 301 Moved Permanently 作为默认的重定向响应代码。

HTTPS 负载均衡器创建后,您可以在负载均衡器列表中看到部分 HTTP 负载均衡器(带有 -redirect 后缀)。按照测试从 HTTP 到 HTTPS 的重定向中的步骤测试您的设置。

对于现有负载均衡器

如果您已有在端口 443 上传送 HTTPS 流量的 HTTPS 应用负载均衡器(此处称为 LB1),您必须创建一个具有以下设置的部分 HTTP 应用负载均衡器(此处称为 LB2):LB1LB1LB1

  • 与 LB1 使用的前端 IP 地址相同
  • 网址映射中配置的重定向

此部分 HTTP 负载均衡器使用与 HTTPS 负载均衡器相同的 IP 地址,并将 HTTP 请求重定向到您的负载均衡器的 HTTPS 前端。

下图展示了此架构。

HTTP 到 HTTPS 重定向配置架构。
图 2.从 HTTP 到 HTTPS 的重定向配置架构(点击可放大)。

将流量重定向到 HTTPS 负载均衡器

验证 HTTPS 负载均衡器 (LB1) 正常运行后,您可以创建部分 HTTP 负载均衡器 (LB2),并将其前端配置为将流量重定向到 LB1。

本示例使用 301 响应代码。您可以改用其他响应代码

如需使用 gcloud 配置重定向,您必须导入 YAML 文件,并确保目标 HTTP 代理指向重定向流量的网址映射。如果您使用的是 Google Cloud 控制台,则系统会为您处理此操作。

Google Cloud 控制台不支持区域级外部应用负载均衡器。

gcloud

  1. 创建 YAML 文件 /tmp/web-map-http.yaml。以下示例使用 MOVED_PERMANENTLY_DEFAULT 作为响应代码。
  2.        kind: compute#urlMap
           name: web-map-http
           defaultUrlRedirect:
             redirectResponseCode: MOVED_PERMANENTLY_DEFAULT
             httpsRedirect: True
           tests:
           - description: Test with no query parameters
             host: example.com
             path: /test/
             expectedOutputUrl: https://example.com/test/
             expectedRedirectResponseCode: 301
           - description: Test with query parameters
             host: example.com
             path: /test/?parameter1=value1&parameter2=value2
             expectedOutputUrl: https://example.com/test/?parameter1=value1&parameter2=value2
             expectedRedirectResponseCode: 301
           
  3. 验证网址映射。
  4.        gcloud compute url-maps validate --source /tmp/web-map-http.yaml
           

    如果测试通过并且命令输出成功消息,请将更改保存到网址映射。

  5. 通过导入 YAML 文件创建 HTTP 负载均衡器的网址映射。此网址映射的名称为 web-map-http
  6.        gcloud compute url-maps import web-map-http \
               --source /tmp/web-map-http.yaml \
               --global
           

    如果您正在更新现有网址映射,系统会显示以下提示:

           Url Map [web-map-http] will be overwritten.
    
           Do you want to continue (Y/n)?
           

    如需继续,请按 Y

  7. 验证网址映射已更新。您的 HTTP 负载均衡器的网址映射应如下所示:
  8.        gcloud compute url-maps describe web-map-http
           
           creationTimestamp: '2020-03-23T10:53:44.976-07:00'
           defaultUrlRedirect:
             httpsRedirect: true
             redirectResponseCode: MOVED_PERMANENTLY_DEFAULT
           fingerprint: 3A5N_RLrED8=
           id: '2020316695093397831'
           kind: compute#urlMap
           name: web-map-http
           selfLink: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/urlMaps/web-map-http
           
  9. 使用 web-map-http 作为网址映射创建新的目标 HTTP 代理或更新现有目标 HTTP 代理。
  10.        gcloud compute target-http-proxies create http-lb-proxy \
               --url-map=web-map-http \
               --global
           
    OR
            gcloud compute target-http-proxies update http-lb-proxy \
               --url-map=web-map-http \
               --global
           
  11. 创建转发规则以将传入请求路由到代理。--address 标志指定 lb-ipv4-1,这是用于外部 HTTPS 负载均衡器的 IP 地址。
  12.        gcloud compute forwarding-rules create http-content-rule \
               --load-balancing-scheme=EXTERNAL_MANAGED \
               --address=lb-ipv4-1 \
               --network-tier=PREMIUM \
               --global \
               --target-http-proxy=http-lb-proxy \
               --ports=80
           

添加自定义 HSTS 标头

当您将 HTTP Strict-Transport-Security 标头添加到 HTTPS 负载均衡器的后端服务时,负载均衡器会将自定义标头发送到客户端,以便客户端下次尝试通过 HTTP 访问网址时,浏览器会重定向请求。标头设置如下所示:

  • 标头名称Strict-Transport-Security
  • 标头值:max-age=31536000; includeSubDomains; preload

如需将自定义标头添加到后端服务配置,请使用 --custom-response-header 标志。

gcloud compute backend-services update BACKEND_SERVICE_NAME_LB1 \
    --global \
    --custom-response-header='Strict-Transport-Security:max-age=31536000; includeSubDomains; preload'

如需了解详情,请参阅创建自定义标头

测试从 HTTP 到 HTTPS 的重定向

请记下您用于两个负载均衡器的预留 IP 地址。

gcloud compute addresses describe lb-ipv4-1 
--format="get(address)"
--global

在本示例中,假设预留的 IP 地址为 34.98.77.106http://34.98.77.106/ 网址会重定向到 https://34.98.77.106/

几分钟后,您可以通过运行以下 curl 命令来进行测试。

curl -v http://hostname.com

示例输出:

* Connected to 34.98.77.106 (34.98.77.106) port 80 (#0)
> GET / HTTP/1.1
> Host: hostname.com
> User-Agent: curl/7.64.0
> Accept: */*
>
< HTTP/1.1 301 Moved Permanently
< Cache-Control: private
< Content-Type: text/html; charset=UTF-8
< Referrer-Policy: no-referrer
< Location: https://hostname.com
< Content-Length: 220
< Date: Fri, 30 Jul 2021 21:32:25 GMT
<
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="https://hostname.com">here</A>.
</BODY></HTML>
* Connection #0 to host hostname.com left intact