Ale*_*ans 14 nginx thin sinatra
我有一个在nginx中运行的Sinatra应用程序(使用thin作为后代理),我redirect '/<path>'在Sinatra中使用语句.但是,当我在https下访问该站点时,这些重定向将发送给我http://localhost/<path>而不是https://localhost/<path>他们应该这样做.
目前,nginx的将控制传递到薄用这个命令,其中是proxy_pass http://thin_clusterthin_cluster
upstream thin_cluster { server unix:/tmp/thin.cct.0.sock; }
Run Code Online (Sandbox Code Playgroud)
我怎样才能解决这个问题?
mat*_*att 22
为了让Sinatra正确地组装用于重定向的URL,它需要能够确定请求是否使用ssl,以便可以使用http或https适当地进行重定向.
显然,对thin的实际调用不使用ssl,因为这是由前端Web服务器处理的,并且代理请求是明确的.因此,我们需要一种方法来告诉Sinatra它应该将请求视为安全,即使它实际上并没有使用ssl.
最终,确定请求是否应被视为安全的代码在Rack::Request#ssl?和Rack::Request#scheme方法中.这些scheme方法检查env散列以查看是否存在多个条目之一.其中一个HTTP_X_FORWARDED_PROTO对应于X-Forwarded-ProtoHTTP头.如果设置了此项,则该值将用作协议方案(http或https).
因此,如果我们在从nginx代理到后端时将此HTTP标头添加到请求中,Sinatra将能够正确地确定何时重定向到https.在nginx中,我们可以将代码添加到代理请求中proxy_set_header,并且该方案在$scheme变量中可用.
所以添加线
proxy_set_header X-Forwarded-Proto $scheme;
Run Code Online (Sandbox Code Playgroud)
proxy_pass在行之后的nginx配置应该使它工作.