2

我目前遇到以下问题

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

这是一个httpd安装在 Centos 服务器上的 Wordpress 网站。

我在`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为全部,所以它看起来像这样:

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

我可以确认它htaccess正在工作,因为我正在使用 iTheme 安全插件,并且它按预期工作,如果我在其中键入一些垃圾,htacces我会按预期收到服务器错误配置错误。

我已将仪表板中的两个 Wordpress URL 都更改为使用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不需要重新启动的更改后都重新启动了服务,但是情况保持不变。谁能指出我正确的方向?

4

1 回答 1

5

最简单的解决方案是使用下面的此解决方案手动替换所有链接,这将节省您的时间并且非常简单。

这个想法是删除所有(协议 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);

更新:您可以简单地使用内容安全策略

HTTP Content-Security-Policy (CSP) upgrade-insecure-requests 指令指示用户代理将站点的所有不安全 URL(通过 HTTP 提供的 URL)视为已被安全 URL(通过 HTTPS 提供的 URL)替换。该指令适用于具有大量需要重写的不安全遗留 URL 的网站。

upgrade-insecure-requests 指令在 block-all-mixed-content 之前被评估,如果它被设置,后者实际上是一个 no-op。建议设置任一指令,但不要同时设置两者,除非您想在旧版浏览器上强制使用 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

于 2016-06-19T01:17:58.650 回答