2015-12-12 27 views
5

Tôi có một ứng dụng đường ray mà tôi đã xây dựng trên Heroku và tôi đã định cấu hình máy chủ để sử dụng SSL ở đó. Bây giờ tôi đang chuyển sang AWS EC2 và tôi muốn nhận một phiên bản ứng dụng của mình hoạt động mà không cần SSL. Khi đã xong, tôi sẽ thêm chức năng SSL sau.Đường ray: Tại sao máy chủ của tôi chuyển hướng http đến https

Ngăn xếp của tôi là Puma + Nginx + PostgreSQL và tôi đang làm việc với Rails 4.2.4, Ruby 2.2.3 và Capistrano 3.4.0.

Tôi nhớ trong ứng dụng của tôi mà tôi đã từng chèn dòng

config.force_ssl = true 

trong config/môi trường/production.rb. Tôi đã nhận xét điều này khiến ứng dụng của tôi quay trở lại hoạt động tốt với http. Nhưng nó đã không: ngay cả sau khi bình luận dòng đó, bất cứ khi nào tôi ghé thăm IP công cộng EC2 của tôi (52.35.82.113) yêu cầu được gửi trên cổng 80 (http) và được chuyển hướng đến cổng 443 (https).

Điều này có thể được nhìn thấy rõ ràng hơn khi tôi chạy curl -v http://localhost trên EC2 của tôi nó sẽ trả về:

* Rebuilt URL to: http://localhost/ 
* Hostname was NOT found in DNS cache 
* Trying 127.0.0.1... 
* Connected to localhost (127.0.0.1) port 80 (#0) 
> GET/HTTP/1.1 
> User-Agent: curl/7.35.0 
> Host: localhost 
> Accept: */* 
> 
< HTTP/1.1 301 Moved Permanently 
* Server nginx/1.4.6 (Ubuntu) is not blacklisted 
< Server: nginx/1.4.6 (Ubuntu) 
< Date: Sat, 12 Dec 2015 12:22:56 GMT 
< Content-Type: text/html 
< Transfer-Encoding: chunked 
< Connection: keep-alive 
< Location: https://localhost/ 
< 
* Connection #0 to host localhost left intact 

Tôi không phải là rất có kinh nghiệm khi nói đến công cụ này. Tôi nghĩ ban đầu vấn đề sẽ được với cấu hình Nginx của tôi, trong câu hỏi trước đây của tôi here nó đã được đề nghị với tôi rằng không có gì sai với cấu hình Nginx của tôi và chuyển hướng đến từ Rails. Tôi nghi ngờ đây là trường hợp vì tôi không thể nhìn thấy bất cứ điều gì trong Nginx có thể được thực thi chuyển hướng, nhưng nếu bạn nghĩ rằng vấn đề có thể có thì bạn có thể thấy rất nhiều mã có liên quan trong liên kết ở trên.

Còn gì khác trong Rails ngoài force_ssl được in ở trên có thể gây ra chuyển hướng?

Cảm ơn sự giúp đỡ của mọi người. Hãy cho tôi biết nếu bạn có bất kỳ câu hỏi nào hoặc cần thêm thông tin!

+1

Tôi đoán về cấu hình nginx của bạn, bạn đã thực hiện ssl lực. – Emu

+0

Bạn đã bao giờ khởi động lại máy chủ Puma chưa? – Tobias

+0

Xin chào @Tobias. Có, tôi đang sử dụng 'ps' để tìm id tiến trình và khởi động lại nó bằng' kill -s SIGUSR2 ' – Dennis

Trả lời

3

Trong Rails, bạn có thể buộc SSL của trang web sử dụng tệp cấu hình (như bạn đang làm) hoặc bạn có thể chọn điểm cuối nào sẽ sử dụng SSL và sử dụng phương thức lớp force_ssl ở cấp bộ điều khiển.

Có thể bạn đã sử dụng phương thức đó trên application_controller.rb hoặc bộ điều khiển nào đang phục vụ đường dẫn gốc và quên nó. Bạn có thể tìm thấy một dụ của cơ chế đó trong thời hạn Rails tài liệu: http://api.rubyonrails.org/classes/ActionController/ForceSSL/ClassMethods.html

force_ssl (options = {}) Liên kết Force yêu cầu đến điều khiển này đặc biệt hay những hành động cụ thể phải được theo giao thức HTTPS.

Nếu bạn cần tắt tính năng này vì bất kỳ lý do gì (ví dụ: phát triển) thì bạn có thể sử dụng: nếu hoặc: trừ khi điều kiện.

class AccountsController < ApplicationController 
    force_ssl if: :ssl_configured? 

    def ssl_configured? 
    !Rails.env.development? 
    end 
end 
+0

Hi @ alexandre-angelim, đó là một cuộc gọi thực sự tốt nhưng tiếc là không, không có gì giống như vậy trong bộ điều khiển ứng dụng của tôi hoặc bộ điều khiển 'chính' của tôi phục vụ đường dẫn gốc. Tôi cũng đã cố gắng tìm kiếm trong config/routes.rb của tôi nhưng không có gì có mà sẽ làm điều đó hoặc – Dennis

0

tôi đã cố gắng trước khi nhận xét dòng này trong máy chủ sản xuất và nó không thay đổi bất cứ điều gì nên thay vì cho ý kiến ​​chỉ cần thay đổi đúng với sai như:

config.force_ssl = false 
+0

@ Dennis: Bạn đã thử này? –

+0

Xin chào @marouenB, đây cũng là một tiếng hét thực sự tốt. Tôi đã thử nó nhưng nó dường như không thay đổi bất cứ điều gì.Tôi cảm thấy như đã có rất nhiều sai với configs của tôi nói chung mặc dù vậy tôi không thể thực sự nói. Cảm ơn đề xuất – Dennis

2

This gist cho thấy nó có thể là do của tiêu đề HSTS:

Vì vậy, nếu bạn đã bật giá trị cấu hình thành false sau đó, trình duyệt bạn đã sử dụng để mở y Ứng dụng ou [r] trước đây sẽ vẫn nhớ trang web này (sử dụng tên miền để nhận diện) [và] yêu cầu [bạn] sử dụng HTTPS và tự động chuyển bạn đến kết nối HTTPS.

Theo this page bạn có thể loại bỏ các mục HSTS của bạn bằng cách vào chrome://net-internals/#hsts trong Chrome và about:permissions trong Firefox và xóa ~/Library/Cookies/HSTS.plist trong Safari.

+1

Đây là vấn đề chính xác mà tôi có và giải pháp cho Chrome (theo liên kết đó; xem xét chỉnh sửa câu trả lời của bạn để bao gồm câu trả lời) là truy cập chrome: // net-internals/# hsts và xóa miền khỏi HSTS. –

+1

Tôi đã thêm một số hướng dẫn về cách xóa các mục nhập HSTS. – eremite

0

Tôi gặp vấn đề tương tự. Giải pháp đối với tôi là:

  1. Xóa config.force_ssl = true từ aplication.rb
  2. Đối với ubuntu Ctrl + Shift + Del => Xóa dữ liệu duyệt
0

tôi có kinh nghiệm vấn đề này quá (ray + puma + nginx). Mỗi redirect_to được gửi đến https, ngay cả khi đến từ http.

Trong vhost.conf đã có dòng này:

proxy_set_header X-Forwarded-Proto https; 

redirect_to làm việc đúng cách sau khi thay đổi đó để

proxy_set_header X-Forwarded-Proto http; 
Các vấn đề liên quan