Смешанный контент/небезопасный контент SSL

В настоящее время у меня есть проблемы со следующим

Mixed Content: The page at 'https://www.example.com/' was loaded over HTTPS, but requested an insecure stylesheet

Это веб-сайт Wordpress на сервере Centos с установленным httpd.

У меня есть следующая настройка виртуального хоста в `http.conf:

NameVirtualHost *:80
NameVirtualHost *:443


<VirtualHost *:443>
    DocumentRoot /var/www/html/example
    ServerName www.example.com
    ServerAlias example.com
    SSLEngine on
    SSLCACertificateFile /etc/httpd/conf/ssl.crt/intermediate.crt
    SSLCertificateFile /etc/httpd/conf/ssl.crt/server.crt
    SSLCertificateKeyFile /etc/httpd/conf/ssl.key/server.key
</VirtualHost>

<VirtualHost *:80>
    ServerName www.example.com
    ServerAlias example.com
    Redirect / https://www.example.com/
</VirtualHost>

В моем httpd.conf я изменил AllowOverride на all, так что это выглядит так:

<Directory "/var/www/html">
    Options Indexes FollowSymLinks
    AllowOverride All
    Order allow,deny
    Allow from all
</Directory>

Я могу подтвердить, что htaccess работает, поскольку я использую плагин безопасности iTheme, и он работает, как и ожидалось, также, если я ввожу какой-то мусор в htacces, я получаю ошибку неправильной конфигурации сервера, как и ожидалось.

Я изменил оба URL-адреса Wordpress на панели инструментов, чтобы использовать https вместо http.

Как только все это было сделано, я смог получить доступ к сайту через HTTP, быть перенаправленным на HTTPS-версию сайта и увидеть сайт. Однако в консоли я получаю сообщение об ошибке, касающееся смешанного содержимого, и экран замка отображается желтым или красным крестом, а не желаемым зеленым.

Есть несколько файлов, которые вызывают проблемы, и я знаю, например, что могу изменить URL-адреса вручную, чтобы использовать https, а не http. Насколько я понимаю, я могу использовать изменение URL-адреса на приведенный ниже, и это просто изменит ссылку на текущий используемый протокол:

<img src="//www.example.com/image.jpg" />

Я также видел, что если ресурс недоступен в течение https, я могу просто сделать следующее:

https://example.com/imageserver?url=http://otherdomain.com/someimage.jpg&hash=abcdeafad

Однако я пытаюсь найти способ исправить все это за один раз, используя htaccess (что-то, что я уверен, что делал раньше, но мои фрагменты не работают для меня).

Есть два основных фрагмента, которые я использовал, пытаясь заставить все https, первый из них:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On

#These Lines to force HTTPS
RewriteCond %{SERVER_PORT} !^443$
RewriteRule ^/(.*) https://%{HTTP_HOST}/$1 [NC,R=301,L]

RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

Второй от Дэйва Уолша:

RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://example.com/$1 [R,L]

Однако ни один из них не решает мою проблему. В качестве меры предосторожности я перезапустил службу httpd после каждого изменения, даже htaccess изменения, которые не требуют перезапуска, однако ситуация остается прежней. Может кто-то указать мне верное направление?


person The Humble Rat    schedule 18.09.2015    source источник
comment
Измените RewriteRule ^/(.*) на RewriteRule ^(.*), если это есть в вашем файле htaccess.   -  person hjpotter92    schedule 18.09.2015
comment
@ hjpotter92 Большое спасибо за ответ, я изменил строки на следующие #These Lines to force HTTPS RewriteCond %{SERVER_PORT} !^443$ RewriteRule ^(.*) https://%{HTTP_HOST}/$1 [NC,R=301,L] К сожалению, это все равно не будет хорошо работать.   -  person The Humble Rat    schedule 18.09.2015
comment
Если это вообще поможет, вы можете быстро отследить проблемы со смешанным контентом с помощью этого настольного приложения или запросить у них отчет: https://www.ecommerce.co.uk/httpschecker   -  person stilliard    schedule 29.03.2016


Ответы (1)


Самое простое решение — заменить все ссылки вручную, используя приведенное ниже решение, которое сэкономит ваше время и будет очень простым.

Идея состоит в том, чтобы удалить все (протокол HTTP и HTTPS) и оставить их для использования относительного URL-адреса протокола https://stackoverflow.com/a/15146073/3599237

Мы можем сделать это, используя следующий код для index.php

<?php
//this lined added here
ob_start();
/**
 * Front to the WordPress application. This file doesn't do anything, but loads
 * wp-blog-header.php which does and tells WordPress to load the theme.
 *
 * @package WordPress
 */

/**
 * Tells WordPress to load the WordPress theme and output it.
 *
 * @var bool
 */
define('WP_USE_THEMES', true);

/** Loads the WordPress Environment and Template */
require( dirname( __FILE__ ) . '/wp-blog-header.php' );

//and these lines also 
$output = ob_get_contents();
ob_end_clean();

$output = str_replace(array("https://", "http://"), "//", $output);
echo str_replace('http:\/\/', "\/\/", $output);

Обновление: вы можете просто использовать Content Security Policy

Директива HTTP Content-Security-Policy (CSP) upgrade-insecure-requests предписывает агентам пользователя обрабатывать все небезопасные URL-адреса сайта (те, которые обслуживаются через HTTP), как если бы они были заменены безопасными URL-адресами (которые обслуживаются через HTTPS). Эта директива предназначена для веб-сайтов с большим количеством небезопасных устаревших URL-адресов, которые необходимо переписать.

Директива upgrade-insecure-requests оценивается до block-all-mixed-content, и если она установлена, последняя фактически не работает. Рекомендуется установить любую директиву, но не обе, если только вы не хотите принудительно использовать HTTPS в старых браузерах, которые не принудительно используют его после перенаправления на HTTP.

Поместите строку ниже в раздел заголовка (файл header.php).

<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">

Для получения дополнительной информации прочитайте: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/upgrade-insecure-requests

person Akam    schedule 19.06.2016
comment
использование // вместо протокола - определенно правильный путь. Такого решения еще не встречал, очень интересно. - person The Humble Rat; 20.06.2016
comment
@TheHumbleRat: я также решил эту проблему при использовании плагина Wordpress Super Cash, если вы использовали его, пожалуйста, сообщите, что я поделюсь с вами решением. - person Akam; 21.06.2016
comment
Решение рабочее, но не идеальное. Если веб-сайт содержит, например, ссылки на другие веб-сайты, этот скрипт также изменит их на https. - person electroid; 30.08.2016
comment
@electroid: вы можете работать над этим, чтобы заменить только свой домен. - person Akam; 30.08.2016
comment
@Akam, есть ли способ сделать то же самое с domain.com/wp-admin/*? пытался отредактировать /wp-admin/index.php тем же приемом, но безрезультатно - person balexandre; 23.03.2018
comment
@balexandre код должен работать, очистите кэш и повторите попытку. - person Akam; 25.03.2018