Изменение маршрута Rails на основе типа развертывания
Есть ли хороший способ изменения маршрута на основе типа развертывания?
В принципе, у меня есть маршрут, который имеет: требования = > {: protocol = > "https" }, и мне бы хотелось, чтобы это произошло только в процессе производства, но не в разработке.
Ответы
Ответ 1
Вы можете явно определить их отдельно и проверить среду
if Rails.env.production?
map.resources :purchases, :requirements => {:protocol => "https"}
else
map.resources :purchases
end
Обратите внимание, что если вы используете более старые версии Rails, используйте ENV ['RAILS_ENV'] == production вместо
Ответ 2
Добавьте константу в начало файла маршрута, например:
ROUTES_PROTOCOL = (Rails.env.production? ? "https" : "http")
И тогда просто выполните:
:protocol => ROUTES_PROTOCOL
для маршрутов, для которых требуется https
Ответ 3
Лучше придерживаться того, что представляет собой текущий протокол.
Если ваша производственная среда включает apache или nginx для статических активов и ssl, убедитесь, что заголовок X-FORWARDED_PROTO https отправлен работнику, когда клиентский запрос находится на порту https.
Таким образом, работники будут являться товаром, который ssl обрабатывается извне, и они могут создавать ссылки с правильным протоколом.
Я знаю, что было бы лучше на serverfault, чем здесь, но вот пример файла конфигурации nginx, который заставляет https и устанавливает правильные заголовки для управления 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;
}
}