Предупреждения о смешанном контенте после смены адреса сайта с HTTP на HTTPS
Я изменил адрес сайта с HTTP на HTTPS, просто поменяв URL в Настройках → Общие (Адрес WordPress и Адрес сайта). В админ-панели нет никаких проблем, всё работает отлично.
Однако на публичной части сайта появилось много "смешанного контента", из-за чего Firefox предупреждает, что сайт небезопасен. Я заметил (через просмотр исходного кода), что почти все изображения, загруженные в медиабиблиотеку, по-прежнему используют HTTP вместо HTTPS.
Что можно сделать, чтобы изображения, шрифты и другие ресурсы загружались по HTTPS?
[ОБНОВЛЕНИЕ] Я обнаружил, что некоторые проблемы можно исправить, отредактировав два файла темы с жёстко прописанными "http://". Основная проблема с изображениями — если не изменять базу данных, решения, видимо, нет.

Это происходит потому, что WordPress по умолчанию сохраняет URL-адреса в контенте в абсолютном виде (то есть в базе данных ваши ссылки сохраняются как http://example.com). Чтобы исправить это, вам нужно выполнить поиск и замену в вашей базе данных.
Я предпочитаю использовать плагин Better Search Replace, потому что в нем есть удобная функция для тестового запуска поиска и замены. Существует множество других методов поиска и замены, и вы также можете внести изменения через PhpMyAdmin, но я приведу инструкции именно для плагина Better Search Replace.
Предположим, вы используете Better Search Replace:
- СДЕЛАЙТЕ РЕЗЕРВНУЮ КОПИЮ БАЗЫ ДАННЫХ! Всегда, всегда, всегда. Используйте любой удобный инструмент (UpdraftPlus, экспорт (НЕ УДАЛЕНИЕ) через PhpMyAdmin или прямо из MySQL — все это варианты).
- Перейдите в Инструменты → Better Search Replace
- В поле поиска укажите версию вашего сайта без SSL (например,
http://example.com
), а в поле замены — версию с SSL - Выберите таблицы, которые нужно обновить. Скорее всего, вам понадобятся только
wp_posts
иwp_postmeta
, но можно выбрать и все. Учтите, что это может занять больше времени или привести к таймауту в зависимости от характеристик вашего сервера. - Выполните тестовый запуск, чтобы убедиться, что все работает корректно
- Если все в порядке, снимите галочку с опции тестового запуска и выполните замену.
- Проверьте сайт, чтобы убедиться, что ошибки устранены. Если да — отлично!
Примечание: При выполнении поиска и замены всегда есть риск серьезно повредить сайт. Поэтому так важен первый шаг — резервное копирование. Если что-то пойдет не так, у вас будет возможность восстановить данные.

Недавно я перешел на SSL, и плагин Better Search Replace просто спас меня. Не забудьте сделать резервную копию базы данных перед использованием.

@Ian Я очень удивлен и разочарован в WP, если для этого требуется подобное решение.

Да, способ, которым WP сохраняет URL, особенно для ассетов, крайне раздражает.

Итак, что (черт возьми) делает WP, когда вы заменяете http на https в Настройки > Общие?

минусую, потому что просто замена текста в записях — это, с одной стороны, слишком много (вы ссылаетесь на http-URL PDF на своем сайте и хотите оставить его http), а с другой — может быть недостаточно (вы встраиваете изображение по http с другого сайта).

@MarkKaplun Я действительно удивлен поведением WP в этом случае: полагаю, это произойдет, даже если вы возьмете свою базу данных и переместите весь сайт на другой домен. Честно говоря, это требует слишком много работы

@3000 на самом деле люди, которые говорят вам "просто используй Let's Encrypt" или что-то подобное, продают вам змеиное масло. HTTPS — это сложно по разным причинам. Например, вам может понадобиться использовать какую-то JS-библиотеку, которая доступна только по HTTP, и она перестанет работать на HTTPS (это реальная проблема, с которой столкнулся мой клиент). Чтобы полностью перейти на HTTPS, недостаточно правильно обработать внутренние URL, но и те внешние ресурсы, которые используются на вашем сайте. Обычно это может потребовать просто замены HTTP на HTTPS...

...(если это поддерживается), но для некоторых ресурсов вам понадобится использовать совершенно другой URL, чтобы получить тот же контент. В итоге, это совсем нетривиально, и нет универсального решения. Поэтому, даже если бы ядро WordPress хотело бы это обработать, по сути, нет способа сделать это правильно для всех. Лично я просто игнорирую предупреждения о смешанном контенте — их влияние на безопасность незначительно, если вы входите в систему через HTTPS, а убрать их все крайне сложно.

Изменение изображений на использование нейтрального протокола (без указания HTTP/HTTPS) — это, наверное, самый простой и значимый шаг, который вы можете сделать в этом направлении. Это можно сделать с помощью небольшого сниппета или поиска и замены, но только того, что конкретно касается URL медиафайлов.

@MarkKaplun 99% моей текущей проблемы связано с изображениями: я обнаружил некоторые HTTP-URL для внешних ресурсов (JS и шрифты), но проверил и их можно легко заменить на HTTPS. Я занимаюсь разработкой (других вещей) годами и, как разработчик, считаю эту проблему с путями действительно "удивительной", чтобы не сказать невероятной

@300 отчасти это результат того, что ядро так и не завершило (уже очень старый) план по включению миграции на другие корневые URL в состав ядра. Если бы такой инструмент существовал, хотя бы часть боли можно было бы избежать.

@Mark Kaplun На самом деле, изначально я думал, что проблема решается простым редактированием URL в общих настройках (и, конечно, редиректом на HTTPS), но я ошибался

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

@Ian Если это может быть полезно: я пробовал очень похожие вещи, которые вы описали, просто используя функцию поиска в PHPMyAdmin и замену в MySQL. В моем случае затронутыми оказались только таблицы wp_posts (тысячи записей), wp_options и wp_usermetas (очень мало записей). Кроме того, я нашел очень интересный комментарий здесь: http://wordpress.stackexchange.com/questions/90206/wp-posts-guid-update (тот, что на желтом фоне) :-)

Вам потребуется перенаправить весь трафик с HTTP на HTTPS. Это можно сделать с помощью правила перезаписи. Используйте следующий код вместо оригинального правила перезаписи WordPress (если вы не используете кеширование) в вашем файле .htaccess
:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{ENV:HTTPS} !=on
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [R,L]
# BEGIN WordPress
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
Существуют также плагины, которые могут сделать это за вас, например Easy HTTPS Redirection.

Это действительно хороший способ обойтись без вмешательства в базу данных!

@Jack Johansson Я перенаправляю сайт таким образом, но есть и смешанный контент. По какой-то причине пути к изображениям должны быть жёстко прописаны где-то (я не могу найти, где именно это "где-то" находится) :-)

@3000 Изображения находятся на том же домене, что и у вас? Даже если они жёстко прописаны, правило перезаписи должно их перенаправлять. Вы используете CDN какого-либо типа?

@JackJohansson Я заметил, что у меня три вида проблем: изображения (на том же домене), шрифты (CDN) и виджет Flickr, который больше не работает (также загружается с внешнего http-адреса)

Я использовал Better Search Replace и Really Simple SSL, и победителем стал:
Просто сделайте следующее:
- Установите его
- Активируйте
- Разрешите SSL
Готово
Он также исправил все проблемы с перенаправлением изображений

Установите этот плагин: https://wordpress.org/plugins/http-https-remover/
Несмотря на название - HTTP / HTTPS Remover - последняя версия принудительно преобразует все http в https, и предупреждения о смешанном содержимом исчезнут.

Проблема с таким плагином в следующем: я должен понимать, что он делает "на низком уровне" (если плагин сломает мой сайт, мне придётся создавать сайт заново)

Я только в прошлую пятницу перевел сайт моей компании на исключительно защищенную версию. Я использовал плагин Really Simple SSL, а затем добавил 301 редирект в мой .htaccess файл.
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Не забудьте также подтвердить HTTPS-версию вашего сайта в Инструментах для веб-мастеров / Search Console

Я добавил код в свой .htaccess файл, который должен перенаправлять все с http на https.

В любом случае, этот код не работает у меня: изображения и т.д. всё ещё загружаются по http:// вместо https://. Я предполагаю - поправьте, если я ошибаюсь - что это проблема с кешем

Возможно, я ошибаюсь, но мне кажется, что изображение не будет кэшироваться и загружаться по https с незащищённой версии. Вы указываете полный URL, например http://example.com/image.png, прямо в тексте?
