Трудный переход на https

Наш сайт два дня лежал, после того как я перевел его на https. Давно собирался, но все оттягивал, предвидя возможные проблемы. В корень я положил файл .maintenance с содержимым «Сайт на техобслуживании. Зайдите позже» и упорно разбирался с причинами смешанного контента и циклических перенаправлений.

Прежде я переводил сайты на https, но с особыми проблемами не сталкивался. Как теперь понимаю, потому что это был LAMP или LEMP, либо даже FEMP, но всегда чистый, без реверс-прокси. Подключил сертификат, поправил .htaccess или location в nginx.conf и всё. Вникнув подробнее в тему, я узнал, что случаи бывают самые разные, особенно на шаред-хостингах, где администрирование сервера «за стенкой».

Например, рецептов перенаправления http на https существует много, например так:

RewriteCond %{HTTPS} off
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

и так:

RewriteCond %{HTTPS} off
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

или так:

RewriteCond %{SERVER_PORT} !^443$
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

еще так:

RewriteCond %{REQUEST_SCHEME} =http
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

или вот так:

RewriteCond %{HTTP:X-HTTPS} !1
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

Причем, магия в том, что даже в авторитетных источниках предлагается попробовать разные варианты, что поможет. Так вот, мне не помогло ничто, кроме $_SERVER["HTTPS"] = "on"; непосредственно в коде (в wp-config.php). Такова оказалась особенность проксирующего Nginx перед Apache у хостера.

Даже вордпрессовский кодекс предлагает попробовать такой вариант:

if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')
$_SERVER['HTTPS'] = 'on';

Проверку, разумеется, можно исключить, если факт уже установлен.

Кстати, средствами вордпресса переадресацию тоже можно делать (в файле functions.php активной темы):

function force_https () {
 if ( !is_ssl() ) {
  wp_redirect('https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'], 301 );
  exit();
 }
}
add_action ( 'template_redirect', 'force_https', 1 );

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *