跳至内容 跳至搜索

Action Dispatch SSL

config.force_ssl = true 时,此中间件将被添加到堆栈中,并传入 config.ssl_options 中设置的选项。它执行三项任务来强制执行安全的 HTTP 请求。

  1. TLS 重定向:将 http:// 请求永久重定向到具有相同 URL 主机、路径等的 https://。默认启用。设置 config.ssl_options 来修改目标 URL。

    config.ssl_options = { redirect: { host: "secure.widgets.com", port: 8080 }`

    或者设置 redirect: false 来禁用重定向。

    请求可以通过 exclude 来选择退出重定向。

    config.ssl_options = { redirect: { exclude: -> request { request.path == "/up" } } }
    

    Cookies 不会为排除的请求标记为安全。

    当通过终止 SSL 的负载均衡器进行代理时,转发的请求看起来就像是 HTTP 而不是 HTTPS,这对应用程序来说是这样。这使得重定向和 Cookie 安全目标指向 HTTP 而不是 HTTPS。为了让服务器假定代理已经终止了 SSL,并且请求实际上是 HTTPS,请将 config.assume_ssl 设置为 true

    config.assume_ssl = true
    
  2. 安全 Cookie:设置 Cookie 上的 secure 标志,以告知浏览器不得随 http:// 请求一起发送。默认启用。通过 secure_cookies: false 设置 config.ssl_options 来禁用此功能。

  3. HTTP 严格传输安全 (HSTS):告知浏览器将此站点记住为仅 TLS,并自动重定向非 TLS 请求。默认启用。通过 hsts: false 配置 config.ssl_options 来禁用。

    通过 hsts: { ... } 设置 config.ssl_options 来配置 HSTS。

    • expires:这些设置将保留多长时间(以秒为单位)。要获得浏览器预加载列表资格的最低要求是 1 年。默认为 2 年(推荐)。

    • subdomains:设置为 true 以告知浏览器将这些设置应用于所有子域名。这可以保护您的 Cookie 免受子域名上易受攻击的网站的拦截。默认为 true

    • preload:宣传此站点可能包含在浏览器预加载的 HSTS 列表中。HSTS 保护您的站点每一次访问,除了第一次访问,因为它还没有看到您的 HSTS 标头。为了弥补这个差距,浏览器供应商包含了一个预置的 HSTS 启用站点列表。前往 hstspreload.org 提交您的站点以获得包含。默认为 false

    要关闭 HSTS,仅省略标头是不够的。浏览器将记住原始 HSTS 指令,直到它过期。相反,使用标头告诉浏览器立即过期 HSTS。设置 hsts: falsehsts: { expires: 0 } 的快捷方式。