2009-10-05 2 views
12

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

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

ответ

15

Вы можете явно определить их по отдельности и тест для окружающей среды

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

Примечание, если вы на более старых версиях Rails, используйте ENV [ «RAILS_ENV»] == производства вместо

+1

В целом, используя Rails.env.production? это путь. Его также можно использовать в файле before_filter, который перенаправляется на https, но это работает так же хорошо. –

+1

Спасибо. По какой-то причине тот факт, что route.rb является обычным старым файлом Ruby, никогда не ударяет меня. Отлично. –

+1

Я просто угадываюсь здесь, но не «Rails.env.development?» Быть «безопаснее»? Я хочу, чтобы мое производство было дефолтом, а разработка - исключением. – Mosselman

0

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

Если ваша производственная среда включает apache или nginx для статических активов и ssl, убедитесь, что заголовок https X-FORWARDED_PROTO отправлен работнику, когда клиентский запрос находится на порту 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; 
     } 
} 
1

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

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

, а затем просто сделать:

:protocol => ROUTES_PROTOCOL 

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

Смежные вопросы