У меня есть страница регистрации на поддомене, например: https://signup.example.com
Он должен быть доступен только через HTTPS, но я боюсь, что люди могут как-то наткнуться на него через HTTP и получить 404.
Мой блок html / server в nginx выглядит так:
html {
server {
listen 443;
server_name signup.example.com;
ssl on;
ssl_certificate /path/to/my/cert;
ssl_certificate_key /path/to/my/key;
ssl_session_timeout 30m;
location / {
root /path/to/my/rails/app/public;
index index.html;
passenger_enabled on;
}
}
}
Что я могу добавить, чтобы люди, которые идут, были http://signup.example.com
перенаправлены на https://signup.example.com
? (К вашему сведению, есть плагины Rails, которые могут форсировать, SSL
но надеялись избежать этого)
nginx
ssl
redirect
ruby-on-rails
Callmeed
источник
источник
Ответы:
В соответствии с подводными камнями nginx , немного лучше пропустить ненужный захват, используя
$request_uri
вместо этого. В этом случае добавьте знак вопроса, чтобы nginx не удваивал аргументы запроса.источник
return 301 http://domain.com$request_uri;
return 301...
приводит к ошибке «слишком много перенаправлений», в то время как метод перезаписи действительно работает.return 301
работает, если (я полагаю) вы не запускаете его и для правильных URL-адресов, прослушивая оба порта (пример конфигурации. Вызывая проблему: возьмите первый ответ serverfault.com/a/474345/29689 и пропустите if ).Лучший способ, как описано в официальном руководстве, - использовать
return
директиву:источник
301 Moved Permanently
(ваши ссылки постоянно перемещены), а также переписываетproxy_set_header X-Forwarded-Proto https;
listen 443;
в одном блоке?Это правильный и наиболее эффективный способ, если вы хотите хранить все это в одном блоке сервера:
Все остальное выше, с использованием «переписать» или «если ssl_protocol» и т. Д. Медленнее и хуже.
Здесь то же самое, но даже более эффективно, только выполняя перезапись по протоколу http, он избегает необходимости проверять переменную $ circuit при каждом запросе. А если серьезно, это настолько незначительная вещь, что вам не нужно их разделять.
источник
Если вы используете новое определение двух серверов HTTP и HTTPS, вы можете использовать следующее:
Похоже, это работает для меня и не вызывает петли перенаправления.
Редактировать:
Заменены:
с линией переписывания Пратика.
источник
If you are using the new dual HTTP and HTTPS server definition
тогда вы должны отделить это.return 301 https://$server_name$request_uri;
как это предпочтительный метод.Еще один вариант, который сохраняет заголовок запроса Host: и следует примеру «ХОРОШО» в ловушках nginx :
Вот результаты. Обратите внимание, что использование
$server_name
вместо$host
будет всегда перенаправлять наhttps://site1
.источник
Note that using $server_name instead of $host would always redirect to https://site1
разве не$request_uri
для этого?$request_uri
не содержит имя хоста или домена. Другими словами, он всегда начинается с символа «/».Убедитесь, что вы установили «безопасный» для любых файлов cookie, иначе они будут отправлены по HTTP-запросу и могут быть получены с помощью такого инструмента, как Firesheep.
источник
Это работает лучше, я думаю. хххх относится к IP вашего сервера. Если вы работаете с Plesk 12, вы можете сделать это, изменив файл «nginx.conf» в каталоге «/var/www/vhosts/system/domain.tld/conf» для любого домена, который вы хотите. Не забудьте перезапустить службу nginx после сохранения конфигурации.
источник
rewrite ^ https://$host$request_uri? permanent;
было бы лучшим решением, так как вы могли бы иметь несколько имен серверов наЯ думаю, что это самое простое решение. Форсирует как HTTPS, так и WWW трафик как без HTTPS, так и без WWW.
РЕДАКТИРОВАТЬ - Апр 2018: Решение без IF можно найти в моем сообщении здесь: https://stackoverflow.com/a/36777526/6076984
источник