WordPress как на ладони
wordpress jino

Как правильно настроить редирект на https и заменить все ссылки в контенте записей?

Вопрос в целом не сложный вроде, я это уже делал как-то раз, но вот на очередном сайте хотелось бы послушать ваш вариант...

Я уже установил ssl на сервере, т.е. сайт уже работает с ssl. Теперь нужно правильно настроить редирект с http на https, и заменить все ссылки с http на https в текстах записей.

Где нужно было, в шаблоне все ссылки я уже заменил на относительные или на ссылки без протокола (//url).

0
Гость 1.7 года назад
  • 1
    Kama4558

    Редиректы

    Редирект наверное лучше всего настроить через .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 %{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 протокол текущей страницы и все ссылки должны измениться автоматом. Автоматом меняется все ссылки в WP, поэтому нет необходимости изменять даже протоколы в ссылках: URL сайта и URL WordPress (в настройках). Их протокол меняется налету...

    Но если этого не произошло (протокол страницы https, но в ней есть ссылки http), то для смены протокола отдельных ссылок в WP есть функция set_url_scheme().

    Пример:

    echo set_url_scheme( 'http://site.ru/foo', 'https' ); // https://site.ru/foo

    Корневая функция на основе которой ставиться протокол всех ссылок - это is_ssl(). Влияя на нее мы может влиять на все ссылки, при условии, что они жестко не прописаны в HTML, а выводятся через различные функции WordPress. Например, следующим кодом мы можем, жестко указать протокол https для всех ссылок на странице, даже если протокол страницы равен http:

    $_SERVER[ 'HTTPS' ] = 'on'; // чтобы is_ssl() всегда возвращала true

    Вызвать такой код нужно как можно раньше, до подключения плагинов. НУ и наверное перед его вызовом нужно сделать какие-то проверки. Этот код - это просто пример...

    Плагины

    Как обычно, можно использовать плагины, я их не пробовал...

    Easy HTTPS Redirection - заглянул в код, вроде бы как раз то что вам нужно...

    WordPress HTTPS (SSL) - вроде тоже хорош, правда не обновляется уже давно. Он, как я понял, заменяет все ссылки во всем HTML документе, работает как комбаин: много лишних операций, но может это и нужно, потому что удобно...

    Комментировать
На вопросы могут отвечать только зарегистрированные пользователи. Регистрация. Вход.