Изменение маршрута Rails в зависимости от типа развертывания - PullRequest
14 голосов
/ 05 октября 2009

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

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

Ответы [ 3 ]

17 голосов
/ 06 октября 2009

Вы можете явно определить их отдельно и протестировать для среды

  if Rails.env.production?
    map.resources :purchases, :requirements => {:protocol => "https"}
  else
    map.resources :purchases
  end

Обратите внимание: если вы используете более ранние версии Rails, используйте ENV ['RAILS_ENV'] == production вместо

3 голосов
/ 20 июля 2012

Добавьте константу в начало вашего файла маршрута, например:

ROUTES_PROTOCOL = (Rails.env.production? ? "https" : "http")

А потом просто сделай:

:protocol => ROUTES_PROTOCOL 

для маршрутов, требующих https

0 голосов
/ 06 марта 2012

Лучше придерживаться текущего протокола.

Если ваша производственная среда использует apache или nginx для статических ресурсов и ssl, убедитесь, что заголовок X-FORWARDED_PROTO https отправляется работнику, когда клиентский запрос находится на порту https.

Таким образом, рабочие будут знать, что ssl фактически обрабатывается извне, и они могут генерировать ссылки с правильным протоколом.

Я знаю, что было бы лучше при сбое сервера, чем здесь, но вот пример конфигурационного файла 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;
        }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...