ruby-on-rails – 代理后面的Rails应用程序,使用SSL,将路径呈现为“http://”

首先,这听起来更像是一个错误,然后是其他任何东西.

我的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;
   }
}
上一篇:javascript-重定向后的jQuery AJAX调用给出错误


下一篇:PHP重定向与范围(字节服务)直通