如何修复在nginx下Sinatra将https重定向到http

如何修复在nginx下Sinatra将https重定向到http,nginx,sinatra,thin,Nginx,Sinatra,Thin,我有一个在nginx中运行的Sinatra应用程序(使用thin作为后台代理),我正在Sinatra中使用redirect'/'语句。但是,当我使用https访问站点时,这些重定向会将我发送到http://localhost/而不是tohttps://localhost/他们应该这样做 目前,nginx使用此命令proxy\u pass\u cluster将控制权传递给thin,其中thin\u cluster为 upstream thin_cluster { server unix:/tmp/

我有一个在nginx中运行的Sinatra应用程序(使用thin作为后台代理),我正在Sinatra中使用
redirect'/'
语句。但是,当我使用https访问站点时,这些重定向会将我发送到
http://localhost/
而不是to
https://localhost/
他们应该这样做

目前,nginx使用此命令
proxy\u pass\u cluster
将控制权传递给thin,其中
thin\u cluster

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

如何解决此问题?

您可以在nginx层强制所有链接转到https。 在nginx.conf中:

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

这也很好,可以确保您的请求始终是https为了使Sinatra能够正确组装用于重定向的url,它需要能够确定请求是否使用ssl,以便可以根据需要使用
http
https
进行重定向

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

最终,确定请求是否应被视为安全的代码位于和方法中。
scheme
方法检查
env
散列,查看是否存在多个条目中的一个。其中一个是
HTTP\u X\u FORWARDED\u PROTO
,它对应于
X-FORWARDED-PROTO
HTTP头。如果设置了该值,则该值将用作协议方案(
http
https

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

因此,添加行

proxy_set_header X-Forwarded-Proto $scheme;

proxy\u pass
行之后添加到nginx配置应该可以工作。

添加
proxy\u set\u头X-Forwarded-Proto$方案在您的
代理\u传递后
行帮助?您应该将其作为答案写下来。。。它解决了我的问题。谢谢这是有帮助的。。。但是没有回答我问的问题。如果服务器在HTTPS模式下运行,我已经有了这个功能;我的问题发生在我想同时接受HTTPS和HTTP的时候。由于某种原因,这弄乱了我头中的主机字段,将我所有的重定向发送到无效域。添加“proxy\u set\u header Host$Host”修复了它。(我的应用程序正在一个子uri下运行,我想知道这是否是一个问题。)@bioneuralnet您也可以使用
X-Forwarded-Host
,它在检查
主机
头之前进行机架检查。我看nginx不会自动添加这些头,但Apache会在mod_proxy中添加这些头。是的,我想这也可以。发现了一个有趣的解释。我正在http块中设置proxy_set_头主机,以便与我的所有应用程序一起使用。根据你的帖子,我在location@myapp中添加了proxy\u set\u头X-Forwarded-Proto。根据文档,“在较高级别发出的代理集头指令只有在给定级别没有发出代理集头指令时才会被继承。”因此,我在@myapp中的“本地”代理集头调用正在清除我的“全局”代理集头调用,即使它们是针对不同字段的。