20

私の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 upstreamy {
    server unix:/var/www//myapp/shared/sockets/unicorn.sock fail_timeout=0;
}

これは正常に動作し、myapp はhttps://somehostとして到達可能です

ただし、アプリはリダイレクト用の http url を生成しているため、たとえば、devise で認証する場合、/ はhttps ではなくhttp://somehost/user/sign_inにリダイレクトされます (Rails アプリの観点からは、とにかくすべて http です)。

私は試した

proxy_pass https://upstreamy;

しかし、これは nginx と Rails アプリを実行するユニコーンの間のトラフィックを暗号化しようとするだけです。

また、application_helper.rbで試しました:

# http://stackoverflow.com/questions/1662262/rails-redirect-with-https
def url_options
  super
  @_url_options.dup.tap do |options|
  options[:protocol] = Rails.env.production? ? "https://" : "http://"
  options.freeze
end

しかし、うまくいかないようです。

これをどのように解決しますか?

編集:したがって、目標は、レールアプリにsslを要求させたり、強制的にsslを使用させたりすることではありません。目標は、リダイレクト時に Rails アプリが https:// URL を生成するようにすることです... (他のすべての URL は相対的だと思います)。

4

2 に答える 2

48

次の行を追加する必要があります。

proxy_set_header X-Forwarded-Proto https;

のように

location / {
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Host $http_host;
      proxy_set_header X-Forwarded-Proto https;
      proxy_redirect off;

      if (!-f $request_filename) {
        proxy_pass http://upstreamy;
        break;
      }
 }
于 2012-05-03T13:39:10.333 に答える
-2

:protocol => "https", を redirect_to に渡すことができます。

以下を application.rb に追加することで、これをデフォルトとして設定できます。

Rails.application.routes.default_url_options[:protocol]= 'https'

参照: https://stackoverflow.com/a/6101147/446203

于 2012-05-03T13:46:16.430 に答える