首先,这听起来更像是一个错误,然后是其他任何东西.
我的rails应用程序由Unicorn提供服务.然后,使用Nginx作为反向代理,我使用SSL将应用程序提供给外部世界.
到目前为止这么好,没问题.我正在使用相对路径(Restful path helpers),所以生成它应该没有问题(对于https://www.example.com):
new_entry_path => https://www.example.com/entries/new
在大多数情况下,这样做很好.
然而,在控制器中我尝试重定向到“显示”操作(使用资源)时出现问题,假设在成功更新后(假设条目为id 100):
redirect_to @entry, flash: {success: "Entry has been updated"}
要么
redirect_to entry_path(@entry), flash: {success: "Entry has been updated"}
他们都产生了重定向:
http://www.example.com/entries/100 # missing 's' in https...
代替
/entries/100 # implying https://www.example.com/entries/100
据我所知,这只发生在show动作中,只在控制器重定向中发生.
做一些可怕而恶心的事情,我绕过了这个:
redirect_to entry_url(@entry).sub(/^http\:/,"https:"), flash: {success: "Entry has been updated"}
有没有人遇到类似的东西?任何想法都将被感激地接受……
解决方法:
我遇到了类似的问题.默认情况下,Rails将使用当前协议用于* _url助手.
我们使用nginx作为Web服务器,使用unicorn作为应用程序服务器. Nginx接受请求,解开SSL部分,然后将其传递给独角兽.因此,独角兽总是收到一个http请求.如果我们现在希望Rails知道原始协议,我们可能需要添加X-Forwarded-Proto头.
示例配置:
upstream app {
server unix:/var/run/myserver/unicorn.sock fail_timeout=0;
}
server {
listen 443 ssl;
server_name myserver;
ssl_certificate "/etc/pki/nginx/myserver.crt";
ssl_certificate_key "/etc/pki/nginx/private/myserver.key";
root /myserver/public;
try_files $uri/index.html $uri @app;
sendfile on;
location @app {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https; # <--- will be used
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://app;
}
}