Наш сайт два дня лежал, после того как я перевел его на 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 );