设置 HTTP 到 HTTPS 重定向

此示例演示了如何使用网址重定向将来自端口 80 (HTTP) 的所有请求重定向到端口 443 (HTTPS)。

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

架构

要将 HTTP 流量重定向到 HTTPS,您必须执行以下操作:

  1. (前提条件)您必须有一个已在端口 443 上提供 HTTPS 流量的外部 HTTPS 负载均衡器(此处称为 LB1)。
  2. 创建部分外部 HTTP 负载均衡器(此处称为 LB2)。LB2 设置具有以下特点:

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

下图展示了此架构。

从 HTTP 到 HTTPS 的重定向配置(点击可放大)
HTTP 到 HTTPS 重定向配置

前提条件:设置外部 HTTPS 负载均衡器 (LB1)

如果您尚未配置外部 HTTPS 负载均衡器,请使用以下指南之一完成该设置。选择后端类型的过程:

如果您已具有正常运行的 HTTPS 负载均衡器,请跳到将流量重定向到 HTTPS 负载均衡器

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

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

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

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

控制台

开始配置

  1. 在 Google Cloud Console 中,转到负载均衡页面。

    转到“负载均衡”

  2. HTTP(S) 负载均衡下,点击开始配置
  3. 选择从互联网到我的虚拟机,然后点击继续
  4. 对于负载均衡器的名称,请输入 http-redirect
  5. 不关闭窗口继续操作。

跳过后端配置

  1. 跳过后端配置部分。
    此负载均衡器不需要后端。

在网址映射中配置重定向

  1. 在页面左侧列中,点击主机和路径规则
  2. 选择高级主机和路径规则(网址重定向、网址重写)
  3. 操作下,选择将客户端重定向到其他主机/路径
  4. 前缀重定向字段留空。
  5. 路径重定向下,选择前缀重定向
  6. 路径值字段留空。
  7. 重定向响应代码下,选择 301 - 永久移动
  8. HTTPS 重定向下,选择启用
  9. 点击完成
  10. 让负载均衡器配置页面保持打开状态以继续操作。

配置与 LB1 使用同一 IP 地址的 HTTP 转发规则

  1. 在负载均衡器配置页面中,点击前端配置
  2. 协议设置为 HTTP
  3. IP 地址设置为您用于 HTTPS 负载均衡器的 IP 地址。
  4. 确保将端口设置为 80 以允许 HTTP 流量。
  5. 点击完成
  6. 不关闭窗口继续操作。

检查配置

  1. 在左侧面板中,点击检查并最终确定
  2. 比较您的设置与您打算创建的内容。
  3. 如果看起来都正确,请点击创建

gcloud

  1. 创建 YAML 文件 /tmp/web-map-http.yaml。以下示例使用 MOVED_PERMANENTLY_DEFAULT 作为响应代码。

    kind: compute#urlMap
    name: web-map-http
    defaultUrlRedirect:
      redirectResponseCode: MOVED_PERMANENTLY_DEFAULT
      httpsRedirect: True
    tests:
    - description: Test with no query parameters
      host: foobar
      path: /test/
      expectedOutputUrl: https://foobar/test/
      expectedRedirectResponseCode: 301
    - description: Test with query parameters
      host: foobar
      path: /test/?parameter1=value1&parameter2=value2
      expectedOutputUrl: https://foobar/test/?parameter1=value1&parameter2=value2
      expectedRedirectResponseCode: 301
    
  2. 验证网址映射。

    gcloud compute url-maps validate --source /tmp/web-map-http.yaml
    

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

  3. 通过导入 YAML 文件创建 HTTP 负载均衡器的网址映射。此网址映射的名称为 web-map-http

    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

  4. 验证网址映射已更新。您的 HTTP 负载均衡器的网址映射应如下所示:

    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
    
  5. 使用 web-map-http 作为网址映射创建新的目标 HTTP 代理或更新现有目标 HTTP 代理。

    gcloud compute target-http-proxies create http-lb-proxy \
       --url-map=web-map-http \
       --global
    

    gcloud compute target-http-proxies update http-lb-proxy \
       --url-map=web-map-http \
       --global
    
  6. 创建全局转发规则以将传入请求路由到代理。--address 标志指定 lb-ipv4-1,这是用于外部 HTTPS 负载均衡器的 IP 地址。

    gcloud compute forwarding-rules create http-content-rule \
       --address=lb-ipv4-1 \
       --global \
       --target-http-proxy=http-lb-proxy \
       --ports=80
    

完成后,Cloud Console 将显示两个负载均衡器,如下所示。

两个负载均衡器

Cloud Console 将显示 web-map-http 负载均衡器的相关信息,如下所示。

HTTP 负载均衡器

添加自定义标头

(可选)将 HTTP Strict-Transport-Security 标头添加到 HTTPS 负载均衡器的后端服务中,如下所示:

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

此设置会将自定义标头发送到客户端,方便客户端下次在尝试通过 HTTP 访问网址时,浏览器会执行重定向。

如需将自定义标头添加到后端服务配置,请使用 --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