是否有基于部署类型修改路由的好方法?
基本上,我的路线有:requirements => {:protocol => “https”},我希望这只发生在制作中,而不是发展中。
答案 0 :(得分:17)
您可以单独明确定义它们并测试环境
if Rails.env.production?
map.resources :purchases, :requirements => {:protocol => "https"}
else
map.resources :purchases
end
注意,如果您使用的是旧版本的Rails,请使用ENV ['RAILS_ENV'] ==生产
答案 1 :(得分:3)
在路径文件的顶部添加一个常量,如:
ROUTES_PROTOCOL = (Rails.env.production? ? "https" : "http")
然后就这样做:
:protocol => ROUTES_PROTOCOL
表示需要https的路由
答案 2 :(得分:0)
最好坚持当前的协议。
如果您的生产环境涉及静态资产和ssl的apache或nginx,请确保在客户端查询位于https端口时将X-FORWARDED_PROTO https标头发送给工作者。
通过这种方式,工作人员将成为ssl在外部进行实际处理的软件,并且可以使用正确的协议生成链接。
我知道在serverfault上会比这更好,但是这里有一个示例nginx配置文件,它强制https并为unicorn worker中的ssl管理设置正确的头:
upstream WEBAPP_NAME {
server unix:/path/to/webapp/tmp/sockets/unicorn.sock fail_timeout=0;
}
server {
listen 4343;
server_name example.com;
root /path/to/webapp/public;
access_log /path/to/logs/nginx-access.log;
error_log /path/to/logs/nginx-error.log;
rewrite_log on;
ssl on;
# redirect when http request is done on https port
error_page 497 https://example.com:4343$request_uri;
ssl_certificate cert.pem;
ssl_certificate_key cert.key;
ssl_session_timeout 5m;
ssl_protocols SSLv2 SSLv3 TLSv1;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location ~ ^/assets/ {
expires 1y;
add_header Cache-Control public;
add_header ETag "";
break;
}
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_pass http://WEBAPP_NAME;
proxy_redirect default;
}
}