Нюансы перехода на 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 и настроить новое основное зеркало в Яндекс.Вебмастер

Смотрите также:


.