我的nginx.conf文件中的服务器声明:
listen 1.2.3.4:443 ssl;
root /var/www/myapp/current/public;
ssl on;
ssl_certificate /etc/nginx-cert/server.crt;
ssl_certificate_key /etc/nginx-cert/server.key;
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
if (!-f $request_filename) {
proxy_pass http://upstreamy;
break;
}
}
nginx.conf中的upstream声明:
upstream upstreamy {
server unix:/var/www//myapp/shared/sockets/unicorn.sock fail_timeout=0;
}
这很好,我的应用可以通过https://somehost访问。
但是应用程序生成的重定向 URL 是 http 类型,因此当使用 Devise 进行身份验证时,/ 会被重定向到http://somehost/user/sign_in而不是 https(从 Rails 应用程序的视角来看,它仍然是 http)。
我尝试过
proxy_pass https://upstreamy;
但这只是尝试加密 nginx 和运行 Rails 应用程序的 unicorn 之间的流量。
我还尝试在 application_helper.rb 中:
# https://dev59.com/8nI-5IYBdhLWcg3w0L_x
def url_options
super
@_url_options.dup.tap do |options|
options[:protocol] = Rails.env.production? ? "https://" : "http://"
options.freeze
end
但是似乎它不起作用。
该怎么解决?
编辑:因此,目标不是使rails应用程序需要ssl,也不强制使用ssl;目标是在重定向时使rails应用程序生成https:// url…(我认为所有其他url都是相对的)。