Нюансы перехода на https
Upgrade-Insecure-Requests
Спецификация Upgrade-Insecure-Requests состоит из двух частей: на стороне браузера и на стороне сайта. Сайт можно отправить заголовок Content-Security-Policy: upgrade-insecure-requests, который обяжет браузеры, которые поддерживают спецификацию Upgrade-Insecure-Requests, отправлять запросы на сайт в защищенном режиме. Спецификация HTTP Strict Transport Security (HSTS) и Upgrade Insecure Requests.
Со стороны браузера может быть отправлен заголовок Upgrade-Insecure-Requests: 1, который говорит серверу, что браузер хочет получать сайт в защищенном режиме (если такой для сайта предусмотрен). Для перевода сайта в защищенный режим необходимо выпустить SSL-сертификат. При наличии SSL-сертификата сайт будет сигнализировать всем браузерам, которые поддерживают этот стандарт, о переходе в безопасный режим и сам переходить в безопасный режим, если получит сигнал от браузера.
Переход на https (SSL) с помощью .htaccess
Реализуем переход с помощью Apache файла .htaccess в корне сайта
# если браузер запрашивает работу по https, перекидываем его на https
RewriteCond %{HTTP:Upgrade-Insecure-Requests} (1) [NC]
RewriteCond %{HTTP_HOST} (_ДОМЕН_) [NC] # на локале не перекидываю
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{HTTPS} off
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=307]
# добавим заголовок рекомендующий браузеру перети на https
<IfModule mod_headers.c>
Header set Content-Security-Policy "upgrade-insecure-requests" env=HTTPS
</IfModule>
К сожалению, у разных хостеров разные настройки, поэтому для определения ситуации я использую следующий набор команд файла .htaccess:
# тестирование хостера
#RewriteCond %{QUERY_STRING} ^ss$ [NC]
#RewriteCond %{HTTPS} off
#RewriteCond %{SERVER_PORT} !^443$
#RewriteCond %{ENV:HTTPS} !on
#RewriteCond %{HTTP:X-HTTPS} !1
#RewriteCond %{HTTP:CF-Visitor} '"scheme":"http"'
#RewriteCond %{HTTP:Front-End-Https} !on
RewriteRule .* https://htmlweb.ru/?a=%{HTTP:Upgrade-Insecure-Requests}&b=%{HTTP:X-Forwarded-Proto}&c=%{HTTP:X-Forwarded-Proto}&d=%{HTTPS}&e=%{SERVER_PORT}&f=%{ENV:HTTPS}&g=%{HTTP:X-HTTPS}&h=%{HTTP:CF-Visitor}&i=%{HTTP:Front-End-Https} [L,R=302]
Переход на https (SSL) с помощью NGINX
server {
if ($http_upgrade_insecure_requests = "1") {
add_header Vary Upgrade-Insecure-Requests;
return 307 https://$host$request_uri;
}
}
Рабочий конфиг виртуального хоста, замените _ДОМЕН_ на имя своего домена:
server {
# теперь нужно слушать 443-й порт и ждать шифрованных данных, защишённых ключами SSL-сертификатов Let's Encrypt вместо простой и понятной передачи текстовых данных на 80-м порту
listen 443 ssl;
server_name _ДОМЕН_;
# Блок с указанием сертификатов и ключей
ssl_certificate /etc/letsencrypt/live/_ДОМЕН_/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/_ДОМЕН_/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/_ДОМЕН_/chain.pem;
# Блок технической части по использованию SSL-сертификатов
ssl_stapling on;
ssl_stapling_verify on;
resolver 127.0.0.1 8.8.8.8;
# переезд на HTTPs протокол:
add_header Strict-Transport-Security "max-age=31536000";
# Отдавать все файлы с изображениями только по HTTPs протоколу
add_header Content-Security-Policy "img-src https: data:; upgrade-insecure-requests";
root /var/www/mb4/data/www/_ДОМЕН_;
charset utf-8;
access_log /var/www/mb4/data/www/logs/_ДОМЕН_.access-nginx.log main;
error_log /var/www/mb4/data/www/logs/_ДОМЕН_-nginx.error.log error;
index index.html index.htm index.php;
include /etc/nginx/letsencrypt;
include /etc/nginx/templates/apache24.conf;
include /etc/nginx/templates/phpmyadmin.conf;
}
# для правильного склеивания зеркал http и https поисковыми машинами. Если не сделать 301-й редирект с 80-го порта,
# по правилам склейки зеркал в Яндексе, склейка не произойдёт и сайты на 80-м порту и 443-м порту
# будут восприниматься как отдельные независимые сайты, что плохо скажется на ранжировании в поисковой выдаче.
# с 80-го порта может начать отдаваться контекст папки по умолчанию, настроенной в основных настройках NGiNX,
# т.е. папки /var/www/html, а в ней, как правило, лежит единственный HTML-файл с приветствием NGiNX.
# По всем остальным запросам будет отдаваться 404-я ошибка (страница не найдена).
И сайт может потерять все страницы, которые были проиндексированы поисковыми роботами.
server {
listen 80;
server_name _ДОМЕН_;
return 301 https://_ДОМЕН_$request_uri;
}
server {
listen 80;
server_name www._ДОМЕН_;
return 301 http://_ДОМЕН_$request_uri;
}
Приведет ли HTTPS к тому, что мой сайт станет работать медленнее?
Да, т.к. HTTPS – это в HTTP + кодирование + проверка сертификата, т.е. переход на HTTPS будет отражается на производительности. Однако в случае с современными платформами это практически незаметно. Более того, если вы переходите на HTTPS + HTTP/2 это фактически может привести к лучшей производительности. Протокол HTTP/2 позволяет добиться значительного улучшения производительности по сравнению с HTTP/1.1, и во всех современных браузерах оно доступно только для защищенных сайтов.
Не забудьте поправить директиву Host: в robots.txt и настроить новое основное зеркало в Яндекс.Вебмастер
Смотрите также:
.
Прокомментировать/Отблагодарить