Подтвердить что ты не робот

Изменение маршрута Rails на основе типа развертывания

Есть ли хороший способ изменения маршрута на основе типа развертывания?

В принципе, у меня есть маршрут, который имеет: требования = > {: protocol = > "https" }, и мне бы хотелось, чтобы это произошло только в процессе производства, но не в разработке.

4b9b3361

Ответ 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;
        }
}