Rails 4ベータ版のウェブサイトを持っています。Nginx + Unicorn で動作しています。nginx でリクエスト プロトコル ( 'http' または 'https' ) を unicorn に転送して、Unicorn と連携できるようにします。しかし、私はそれを機能させることができません。
テスト用にビューファイルに<%= request.ssl? %>
andを入れました。<%= request.protocol %>
私のnginxサーバー構成ファイルは次のとおりです。
upstream unicorn {
server unix:/tmp/unicorn.blog.sock fail_timeout=0;
}
server {
listen 80;
listen 443;
server_name example.com;
root /home/example;
ssl on;
ssl_certificate /etc/nginx/ssl/server.crt;
ssl_certificate_key /etc/nginx/ssl/server.key;
location ^~ /assets/ {
gzip_static on;
expires max;
add_header Cache-Control public;
}
try_files $uri/index.html $uri @unicorn;
location @unicorn {
proxy_set_header X-Forwarded-Proto https; # <--- Line 1
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-Ssl on; # <--- Line 2
proxy_redirect off;
proxy_pass http://unicorn;
}
error_page 500 502 503 504 /500.html;
client_max_body_size 4G;
keepalive_timeout 10;
}
マークした 2 行が正しく動作していないことがわかりました。ここに私のテスト結果があります:
=================
行 1 がコメントアウトされ、行 2 もコメントアウトされました。
<%= request.ssl? %> : false
<%= request.protocol %> : http
https://the.url にアクセスしてください
<%= request.ssl? %> : false
<%= request.protocol %> : http
=================
行 1 はコメント アウトされています。行 2 は OR ではありません。行 2 はコメント アウトされています。行 1 は OR ではありません。
<%= request.ssl? %> : true
<%= request.protocol %> : https
https://the.url にアクセスしてください
<%= request.ssl? %> : true
<%= request.protocol %> : https
=================
つまり、これらの 2 つの行のいずれかが表示された場合、実際のプロトコルが何であれ、nginx は "https" をアップストリームに転送します。しかし、これらの 2 行のいずれも表示されない場合、実際のプロトコルが何であれ、nginx は「http」をアップストリームに転送します。
プロトコルを正しく転送できるようにnginx構成ファイルを作成する方法を教えてください。どうもありがとうございました。