【问题标题】:How to fix Sinatra redirecting https to http under nginx如何修复 Sinatra 在 nginx 下将 https 重定向到 http
【发布时间】:2023-03-15 01:12:01
【问题描述】:

我有一个在 nginx 中运行的 Sinatra 应用程序(使用 Thin 作为反向代理),我在 Sinatra 中使用 redirect '/<path>' 语句。但是,当我在 https 下访问该站点时,这些重定向会将我发送到 http://localhost/<path> 而不是应有的 https://localhost/<path>。

目前,nginx 使用此命令proxy_pass @987654321@_cluster 将控制权传递给瘦身,其中thin_cluster 是

upstream thin_cluster { server unix:/tmp/thin.cct.0.sock; }

我该如何解决这个问题?

【问题讨论】:

  • 在proxy_pass 行后添加proxy_set_header X-Forwarded-Proto $scheme; 有帮助吗?
  • 你应该把它写成答案......它解决了我的问题。谢谢!

标签: nginx sinatra thin


【解决方案1】:

你可以在 nginx 层强制所有链接去 https。 在 nginx.conf 中:

server{
   listen 80;
   server_name example.com;
   rewrite    ^(.*) https://$server_name$1 redirect;
}    

确保您的请求始终是 https

【讨论】:

  • 这很有帮助...但没有回答我提出的问题。如果服务器在 HTTPS-only 模式下运行,我已经可以使用此功能;当我想同时接受 HTTPS 和 HTTP 时,就会出现问题。
【解决方案2】:

为了让 Sinatra 正确组装用于重定向的 url,它需要能够确定请求是否使用 ssl,以便可以酌情使用http 或https 进行重定向。

显然,对瘦的实际调用没有使用 ssl,因为这是由前端 Web 服务器处理的,并且代理请求是明确的。因此,我们需要一种方法来告诉 Sinatra 它应该将请求视为安全的,即使它实际上并未使用 ssl。

最终,确定请求是否应被视为安全的代码位于 Rack::Request#ssl? 和 Rack::Request#scheme 方法中。 scheme 方法检查 env 哈希以查看是否存在多个条目之一。其中之一是HTTP_X_FORWARDED_PROTO,它对应于X-Forwarded-Proto HTTP 标头。如果设置了此项,则该值将用作协议方案(http 或 https)。

因此,如果我们在请求从 nginx 代理到后端时将这个 HTTP 标头添加到请求中,Sinatra 将能够正确确定何时重定向到 https。在 nginx 中,我们可以使用proxy_set_header 为代理请求添加标头,该方案在$scheme variable 中可用。

所以添加一行

proxy_set_header X-Forwarded-Proto $scheme;

proxy_pass 行之后的 nginx 配置应该可以工作。

【讨论】:

  • 由于某种原因,这搞砸了我标题中的 Host 字段,将我所有的 redirect_to 发送到无效域。添加“proxy_set_header Host $host”修复了它。 (我的应用在 sub-uri 下运行,我想知道这是否是个问题。)
  • @bioneuralnet 你也可以使用X-Forwarded-Host,它会在检查Host 标头之前进行机架检查。我看起来不像 nginx 自动添加这些头文件,但 Apache 在 mod_proxy 中会这样做。
  • 是的,我想这也行。在wiki.nginx.org/HttpProxyModule#proxy_set_header 找到了一个有趣的解释。我在 http 块中设置了 proxy_set_header 主机,用于我的所有应用程序。根据您的帖子,我在@myapp 位置添加了 proxy_set_header X-Forwarded-Proto。根据文档,“只有在给定级别没有发出 proxy_set_header 指令时,才会继承在更高级别发布的 proxy_set_header 指令。”所以我在@myapp 中的“本地”proxy_set_header 调用正在清除我的“全局”proxy_set_header 调用,即使它们是针对不同字段的。
猜你喜欢
  • 2022-08-14
  • 2011-03-29
  • 2018-01-05
  • 1970-01-01
  • 2011-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-11
相关资源
最近更新 更多