Как правильно настроить редирект на https и заменить все ссылки в контенте записей?
Вопрос в целом не сложный вроде, я это уже делал как-то раз, но вот на очередном сайте хотелось бы послушать ваш вариант...
Я уже установил ssl на сервере, т.е. сайт уже работает с ssl. Теперь нужно правильно настроить редирект с http на https, и заменить все ссылки с http на https в текстах записей.
Где нужно было, в шаблоне все ссылки я уже заменил на относительные или на ссылки без протокола (//url).
Редиректы
Редирект наверное лучше всего настроить через .htaccess, путем вставки такой конструкции перед правилами WordPress. А лучше перед всеми правилами, т.е. в самое начало файла:
# SSL: 301 redirect to https from http <IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{SERVER_PORT} !^443$ RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L] </IfModule>Еще вариант:
RewriteCond %{HTTP:X-HTTPS} !1 RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]Еще вариант:
RewriteCond %{HTTPS} !=on RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]Еще вариант:
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /(.*)\ HTTP/ [NC] RewriteCond %{HTTPS} off [NC] RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R=301,QSA,L]Тут важно, что устанавливается 301 редирект, в сети посмотрел эту тему, кое-где его не используют, а он нужен!
Также, можно установить редирект в PHP, вместе с редиректом c .htaccess. Пригодится, если по какой-то причине редирект с апача слетит, чтобы PHP был на подстраховке...
## redirect с http на https add_action('init', 'http_to_https_redirect'); function http_to_https_redirect(){ if( is_ssl() ) return; if ( 0 === strpos($_SERVER['REQUEST_URI'], 'http') ) wp_redirect( set_url_scheme( $_SERVER['REQUEST_URI'], 'https' ), 301 ); else wp_redirect( 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'], 301 ); exit; }Изменение URL в контенте
В сети видел предложения заменять http на https прямо в базе данных. Я думаю это не лучшее решение, потому что возможно в будущем вы откажетесь от SSL и тогда нужно будет все менять обратно... Поэтому лучше делать замену на лету, таким кодом (он быстрый):
add_filter('the_content', 'replace_url_to_https', 30); function replace_url_to_https( $text ){ $text = preg_replace('~http(://(?:www.)?'. preg_quote($_SERVER['HTTP_HOST']) .')~', 'https\1', $text ); return $text; }Как вы, наверное, понимаете функцию replace_url_to_https() можно будет применить к любому тексту, где нужно заменить
текст http://ваш-сайт.ru/* текстнатекст https://ваш-сайт.ru/* текст. Она меняет все без разбора, будь то картинки или что-то еще, но только для URL относящихся к текущему домену...Изменение URL других ссылок
Вообще WordPress автоматически подстраивается под https протокол текущей страницы и все ссылки должны измениться автоматом. Поэтому нет необходимости изменять даже протоколы в ссылках: URL сайта и URL WordPress (в настройках). Их протокол меняется налету...
Но если этого не произошло (протокол страницы https, но в ней есть ссылки http), то для смены протокола отдельных ссылок в WP есть функция set_url_scheme().
Пример:
Корневая функция на основе которой ставиться протокол всех ссылок - это is_ssl(). Влияя на нее мы может влиять на все ссылки, при условии, что они жестко не прописаны в HTML, а выводятся через различные функции WordPress. Например, следующим кодом мы можем, жестко указать протокол https для всех ссылок на странице, даже если протокол страницы http:
Вызвать такой код нужно как можно раньше, до подключения плагинов. И наверное перед его вызовом нужно сделать какие-то проверки. Этот код - это просто пример...
Плагины
Как обычно, можно использовать плагины (я их не пробовал)...
Easy HTTPS Redirection - заглянул в код, вроде бы как раз то что вам нужно...
WordPress HTTPS (SSL) - вроде тоже хорош, правда не обновляется уже давно. Он, как я понял, заменяет все ссылки во всем HTML документе, работает как комбаин: много лишних операций, но может это и нужно, потому что удобно...