2012-05-03 27 views
19

khai máy chủ trong nginx.conf tôi:https chuyển hướng cho ứng dụng đường ray đằng sau proxy?

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; 
      } 
    } 

khai thượng nguồn trong nginx.conf:

upstream upstreamy { 
    server unix:/var/www//myapp/shared/sockets/unicorn.sock fail_timeout=0; 
} 

này hoạt động tốt, myapp có thể truy cập như https://somehost

nhưng ứng dụng được tạo ra http url cho chuyển hướng, vì vậy ví dụ khi xác thực bằng phát minh,/được chuyển hướng đến http://somehost/user/sign_in thay vì https (từ quan điểm của ứng dụng đường ray, đó là tất cả http anyway).

tôi đã cố gắng

proxy_pass https://upstreamy; 

nhưng đó chỉ là cố gắng để mã hóa giao thông giữa nginx và kỳ lân chạy ứng dụng đường ray.

Tôi cũng đã cố gắng, trong 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 

nhưng nó dường như không làm việc.

Làm cách nào để giải quyết vấn đề này?

Chỉnh sửa: vì vậy, mục tiêu không phải là làm cho ứng dụng đường ray yêu cầu ssl hoặc bị buộc phải sử dụng ssl; mục tiêu là làm cho ứng dụng đường ray tạo url https: // khi chuyển hướng ... (Tôi nghĩ rằng tất cả các url khác là tương đối).

Trả lời

42

Bạn cần phải thêm dòng sau:

proxy_set_header X-Forwarded-Proto https;

như trong

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; 
     } 
} 
+1

Cảm ơn, mà làm việc một cách hoàn hảo! –

+0

Tuyệt vời! Thiết lập nginx có thể rất đau đớn. Rất đau đớn ... :) –

+0

Tôi không thể sử dụng proxy_set_header nhưng tôi chỉ chuyển tiếp mọi thứ tới proxy của mình cho phương thức "đăng" và viết lại url để nhận. Làm việc rất tốt cho đến nay. – nembleton

-2

Bạn có thể vượt qua :protocol => "https", để redirect_to.

Bạn có thể thiết lập này như một mặc định bằng cách thêm dòng sau vào application.rb

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

tham khảo: https://stackoverflow.com/a/6101147/446203

+0

Đây không phải là mã minh bạch và mã ứng dụng cho một cấu hình triển khai cụ thể. – eprothro

Các vấn đề liên quan