我使用Rails url_helpers 在我的应用中构建资源网址。
开发中的网址示例为http://localhost:3000/resource/1
,由resource_url(resource)
url_helper 生成。
我在生产中使用nginx来 proxy_pass 对我的rails应用程序的请求。我的nginx侦听端口433 https并重定向到端口5000 http:
上的rails应用程序server {
listen 443 ssl;
server_name api.staging.zup.me;
ssl_certificate /etc/ssl/certs/cert.crt;
ssl_certificate_key /etc/ssl/certs/cert.key;
location / {
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://localhost:5000;
}
}
因为我的Rails应用程序从nginx代理收到的请求是 http ,所以它生成的网址如http://example.com/resource/1
,但仅在生产中我希望我的所有网址都使用< strong> https ,例如https://example.com/resource/1
。
让Rails仅在生产中使用 https 协议生成网址的最佳方法是什么?
答案 0 :(得分:1)
您可以在nginx中使用重定向,并且永远不要触摸rails应用以启用https:
server {
listen 80 default_server deferred;
server_name myserver.domain;
return 301 https://$server_name$request_uri; # enforce https
}
# HTTPS server
server {
listen 443;
server_name myserver.domain;
ssl on;
ssl_certificate /etc/nginx/ssl/myserver.domain.crt;
ssl_certificate_key /etc/nginx/ssl/myserver.domain.key;
root /srv/www/myserver;
...
}
不确定这是否是最佳方式,但我喜欢它,因为你不必对rails app做任何事情,只有nginx。