Как не перенаправить, если запрашивает только имя_сервера
Большинство людей печатают в панели браузера: mysite.com
и не https://mysite.com
,
У многих разработчиков, в том числе и у меня, есть что-то подобное в их конфигурационном файле Nginx, что означает, что это mysite.com
запрос вызывает redirect
к https://
сайт:
server {
listen 80;
server_name mysite.com;
return 301 https://$server_name$request_uri;
}
Команда Google PageSpeed недавно сказала [ref], что эти перенаправления ужасны для производительности, особенно на мобильных устройствах, потому что redirect
вызывает запрос на возврат через сеть мобильной связи.
У меня вопрос, есть ли другой способ написать nginx.conf так, чтобы люди печатали в server_name
не переживай этого http://
в https://
перенаправить штраф?
2 ответа
Нет, для этого потребуется изменить поведение браузера. Это все на основе ответа на запрос. Пользовательские типы example.com
в его панели браузера и браузер автоматически добавляет http://
перед этим. Таким образом, ваш сервер всегда будет получать первый запрос на http://example.com
и вы можете ответить только перенаправлением на ваш адрес с поддержкой SSL, если нет ничего без SSL.
Отклонить просьбу, предложенную Натаном, абсолютно невозможно. Поскольку браузер отобразит страницу с ошибкой, что этот веб-сайт недоступен и может даже не существовать.
Но есть еще кое-что, что вы можете сделать: HTTP Strict Transport Security (HSTS)
HSTS сообщает браузеру, что ваш сайт доступен только через SSL и что последующие запросы всегда должны автоматически заполняться https://
вместо http://
, Вы можете добиться этого в nginx с помощью следующих строк в блоке вашего SSL-сервера:
add_header Strict-Transport-Security "max-age=262974383";
http {
# One server listening on port 80 and sending the redirect to HTTPS
server {
server_name example.com;
return 301 https://$server_name$request_uri;
}
# Our actual server handling incoming requests.
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/ssl/my_site.pem;
ssl_certificate_key /etc/ssl/my_site.key;
# Tell the browser that he should always visit us with SSL.
add_header Strict-Transport-Security "max-age=262974383";
}
}
Либо не слушайте порт 80 (который выдаст ошибку), либо отклоните запрос:
server {
listen 80;
server_name mysite.com;
location / {
deny all;
}
}
Тогда просто возьмите свой обычный блок 443.