跳至内容 跳至搜索

Action Dispatch SSL

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

  1. TLS 重定向:永久地将 http:// 请求重定向到 https://,其 URL 主机、路径等相同。默认情况下启用。设置 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 } 的快捷方式。