#ruby-on-rails #ruby #nginx #passenger
#ruby-on-rails #ruby #nginx #пассажир
Вопрос:
У меня есть следующий фрагмент, который отлично работает на Heroku (production) для принудительного использования SSL:
# /config/routes.rb
scope protocol: 'https://', constraints: { protocol: 'https://' } do
resource :user
resource :session
end
Я пытаюсь настроить машину разработки с использованием NGINX и passenger с SSL, однако я получаю:
Action Controller: Exception
No Route Matches [GET] "/session/new"
Я получаю зеленый SSL в Chrome при просмотре других разделов приложения с помощью HTTPS, поэтому кажется, что SSL работает. По какой-то причине принудительное использование маршрутов не соответствует корректно. Мой nginx.conf
:
worker_processes 4;
events {
worker_connections 1024;
}
http {
gzip on;
sendfile on;
include mime.types;
ssl_certificate cert.crt;
ssl_certificate_key cert.key;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
keepalive_timeout 60;
rack_env development;
passenger_user kevin;
passenger_root /Users/kevin/.rvm/gems/ruby-1.9.2-p290/gems/passenger-3.0.9;
passenger_ruby /Users/kevin/.rvm/wrappers/default/ruby;
server {
listen 80;
listen 443 ssl;
server_name local.demo;
location / {
root /Users/kevin/Sites/demo/public;
passenger_enabled on;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Ssl on;
proxy_set_header X-Forwarded-Proto https;
}
}
}
Есть идеи, как это исправить?
Комментарии:
1. Есть ли причина не использовать rack-ssl или аналогичное промежуточное программное обеспечение? Если ваши файлы cookie передаются вообще без SSL, то вы в любом случае уязвимы для атаки в стиле firesheep.
2. @codatory Они принудительно используют SSL на всех маршрутах (я хочу использовать SSL только на определенных маршрутах).
3. Вы получаете ошибку при прямой навигации как с использованием SSL, так и без него
Ответ №1:
Я не уверен, что это правильный подход к вашей проблеме, но в моем nginx.conf я постараюсь
переписать URL-адрес, который я хотел бы использовать по умолчанию для https:
server {
listen 80;
server_name local.demo;
rewrite ^(.*)$ https://local.demo$1 permanent;
}
server {
listen 443 ssl;
server_name local.demo;
location / {
root /Users/kevin/Sites/demo/public;
passenger_enabled on;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Ssl on;
proxy_set_header X-Forwarded-Proto https;
}
}
Эта настройка принудит любые запросы к http://local.demo / чтобы пройти через https://local.demo .
В качестве альтернативы вы можете быть более конкретными и фильтровать по местоположению или шаблону на основе сопоставления:
location ~ ^/sslrequired/(.*)$ {
rewrite ^(.*)$ https://local.demo/$1 permanent;
}
В общем случае это можно считать обходным путем, но почему бы не позволить серверу применять
SSL, когда вы намереваетесь, чтобы пользователь действительно его использовал 😉
Для получения дополнительной информации вы можете посмотреть HttpRewriteModule в nginx wiki.
Я надеюсь, что это полезно для вашего случая.
Комментарии:
1. Я действительно пытаюсь интегрировать это с кодом Rails, чтобы я мог принудительно использовать SSL из своего файла routes. Спасибо.