Измените все вхождения «http» на «https» на странице WordPress - PullRequest
5 голосов
/ 19 мая 2011

Я нахожусь в процессе реализации SSL на некоторых страницах моего WordPress-сайта. В настоящее время я получаю предупреждения о смешанном содержимом на защищенных страницах - моя настраиваемая тема включает в себя множество ссылок и атрибутов src, которые встречаются на всех страницах. Ссылки появляются в верхнем колонтитуле, нижнем колонтитуле, навигации (автоматически генерируется функцией WordPress) и боковой панели (частично из плагина). Хотя теоретически я мог бы написать собственный верхний и нижний колонтитулы для защищенных страниц, было бы невозможно использовать плагин и навигацию на защищенной странице.

То, что я пытался выполнить весь день, - это написать функцию javascript или jQuery, которая изменяет все вхождения с «http» на «https» на страницах, которые обслуживаются через SSL.

Эта проблема явно показала мне пределы моей способности кодирования. Проблема заключается в том, что окончательно обработанный документ состоит из нескольких файлов php, некоторые из которых я мало контролирую (придется модифицировать плагины (ы), которые являются (A) довольно сложными и (B) я хотел бы обновить в будущем ). Также регулярные выражения все еще остаются для меня загадкой.

Я не знаю, возможно ли это вообще и будет ли запуск изменений с помощью $ (документ) .ready или window.onload все равно не слишком поздно, так как браузер выдаст предупреждение о смешанном контенте раньше, чем это.

Заранее спасибо, Йоханнес

Ответы [ 8 ]

11 голосов
/ 19 мая 2011

Вы смотрели на относящийся к протоколу относительный префикс url?

Например, если у вас есть следующее

<img src="//myimage.png" />

Он будет использовать любой протокол, на котором в данный момент находится страница.Дополнительная информация: http://paulirish.com/2010/the-protocol-relative-url/

6 голосов
/ 19 мая 2011

Я согласен с другими авторами, которые предполагают, что есть лучшие способы сделать то, что вам нужно. С учетом вышесказанного звучит так, будто вы оказались в безвыходном положении, так что позвольте мне предложить вам трещину. (Кстати, отзыв и +1 голос к относительному URL протокола; я не знал об этом!)

В любом случае, я предполагаю, что то, что вы ищете, находится в тегах <a>, но это должно быть легко экстраполировать это на другие:

if (document.location.protocol === 'https:') {
    $('a').each(function() {
        var href = $(this).attr('href');
        if (href.indexOf('http:') > -1) {
            href = href.replace('http:', 'https:');
            $(this).attr('href', href);
        }
    });
}

С этой помощью я бы посоветовал вам посмотреть, есть ли более безопасный / более практичный способ сделать то, что вы пытаетесь сделать. Я также упомяну, что этот подход, вероятно, будет работать только для ссылок; изменение ссылок CSS и скриптов после загрузки страницы, безусловно, будет иметь неприятные последствия и не даст вам желаемого результата.

Обратите внимание на ":" в "document.location.protocol === 'https:'".

5 голосов
/ 19 мая 2011

Я думаю, что вы должны использовать плагин, такой как "WordPress HTTPS" .Существует слишком много крайних случаев, о которых вам следует знать (например, о сторонних плагинах, которые не контролируются вами), и использование хорошо зарекомендовавшего себя надстройки, подобной этой, было бы интересным подходом.WordPress HTTPS призван стать универсальным решением для использования SSL на сайтах WordPress.Бесплатная поддержка предоставляется!

4 голосов
/ 19 мая 2011

Я думаю, что вы должны делать это на серверной стороне , путем установки файла cookie или чего-то подобного, вместо использования JavaScript для обработки такой потенциально опасной дыры в безопасности.

3 голосов
/ 18 февраля 2016

, если вы хотите убедиться, что нет смешанного содержимого при выполнении запроса HTTPS, попробуйте добавить простой фрагмент кода в файл "function.php" текущей темы.

function _bd_force_https()
{
    if ( empty( $_SERVER['HTTPS'] ) ) return;
    ob_start();
}
add_action( 'template_redirect', '_bd_force_https', 1 );

function _bd_output_https_page()
{
    if ( empty( $_SERVER['HTTPS'] ) ) return;
    echo str_ireplace( 'http://', 'https://', ob_get_clean() );
}
add_action( 'wp_footer', '_bd_output_https_page', 99 );

PROS:

  • очень скудный, просто добавить
  • не использует javascript / jquery

CONS:

  • неплагин, поэтому он сломается при изменении темы
  • не может перехватывать HTTP-запросы, сделанные javascripts со стороны клиента
2 голосов
/ 11 апреля 2013

Если бы сегодня была именно эта проблема, WordPress-HTTPS у меня вообще не работал, из-за того, что я пытался сохранить настройки, мой браузер зависал в моем браузере.Я нашел гораздо более простой плагин, который прекрасно справился с задачей: http://wordpress.org/extend/plugins/ssl-insecure-content-fixer/

В качестве примечания: если вы используете обратный прокси-сервер, такой как nginx, как я, вам нужно будет следовать совету здесь: http://blog.netflowdevelopments.com/2013/04/10/fixing-this-page-includes-script-from-unauthenticated-sources-problem-with-ssl-wordpress-install-on-apachenginx-server/

по сути это:

if (stripos (get_option ('siteurl'), 'https://') === 0) {$ _SERVER [' HTTPS '] =' on ';}

в конце вашего файла wp-config.php

1 голос
/ 27 августа 2015

После всех других шагов миграции, если вы все еще получаете смешанный контент:

sudo apt-get install php5-cli
curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
pushd /var/www/path/
php /path/to/wp-cli.phar search-replace 'http://example.com' 'https://example.com' --skip-columns=guid --dry-run

, если в порядке,

php /path/to/wp-cli.phar search-replace 'http://example.com' 'https://example.com' --skip-columns=guid

от: https://helgeklein.com/blog/2015/01/switching-wordpress-site-http-https/

0 голосов
/ 07 июля 2018

Лучше изменить устаревшие URL-адреса на уровне базы данных, ИМХО.Чтобы заменить все http:// вхождения на независимые от протокола //, запустите эти SQL:

UPDATE wp_posts 
SET    post_content = ( Replace (post_content, 'src="http://', 'src="//') )
WHERE  Instr(post_content, 'jpeg') > 0 
        OR Instr(post_content, 'jpg') > 0 
        OR Instr(post_content, 'gif') > 0 
        OR Instr(post_content, 'png') > 0;

Для вхождений в одинарных кавычках:

UPDATE wp_posts 
SET   post_content = ( Replace (post_content, "src='http://", "src='//") )
WHERE  Instr(post_content, 'jpeg') > 0 
        OR Instr(post_content, 'jpg') > 0 
        OR Instr(post_content, 'gif') > 0 
        OR Instr(post_content, 'png') > 0;

Для получения дополнительной информации проверьте здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...