当我们将网站转换为 https:// 后,由于仍有一些资源指向 http://,导致我们的网站崩溃。经过一段时间的研究,我发现 get_template_directory_uri() 函数始终返回 http://,即使我们的 wp_home 和 wp_site_url 已经设置为 https://。
是否还有其他地方需要更改 URL?因为我们正在使用子主题,而该函数获取父主题目录。
谢谢, Raju Vishwas
检查$_SERVER['HTTPS']
的值。该值应设置为on
或1
。如果被设置为其他值,则此函数将输出http而不是https。
参见:https://core.trac.wordpress.org/browser/tags/4.5.3/src/wp-includes/functions.php#L4025
根据发起者添加的评论:
在我的情况下,我们使用负载均衡服务器,并且SSL证书已安装在负载均衡器上。
@pbond的答案只是挖掘了问题的根本原因。WordPress的is_ssl()
函数检查$_SERVER['HTTPS']和$_SERVER['SERVER_PORT']以检查当前页面是否通过https访问,但负载均衡器很可能在非SSL端口80上请求您的内容。
解决此问题的一个好方法是使用X-Forwareded-Proto
HTTP头来确定客户端在负载均衡器另一侧实际使用的协议。
对于Apache 2.2,您可以将此添加到配置中:
<IfModule mod_setenvif.c>
SetEnvIf X-Forwarded-Proto "^https$" HTTPS
</IfModule>
另一个可能的解决方法(由@Roberto Poblete提到但未解释)是将此代码添加到wp-config.php
中。
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')
$_SERVER['HTTPS'] = 'on';
查看链接的注释 https://codex.wordpress.org/Function_Reference/is_ssl
该函数用于检查当前页面是否使用SSL协议进行访问。如果是,则返回true,否则返回false。此函数不需要任何参数。if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')
$_SERVER['HTTPS'] = 'on';
这个方法对我非常有效,在wp-config文件的结尾添加如下内容:
define('FORCE_SSL_ADMIN', true);
define('WP_HOME', 'https://' . $_SERVER['HTTP_HOST']);
define('WP_SITEURL', WP_HOME);
你尝试过使用修改后的 .htaccess 文件通过 https 强制传输内容吗?
以下是我正在使用的代码片段:
#Force HTTPS
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
检查已安装的插件列表。任何涉及缓存、CDN等的插件可能会干扰get_template_directory_uri。在我们的案例中,客户安装了大量插件,以期加快网站速度。
没有启用任何插件时,https加载正常。因此,只需要找出是哪个插件造成的问题。而在有问题的插件设置中,存在一个http版本的站点路径。
get_stylesheet_directory_uri();
它将是一个网址(以http://或https://开头用于SSL)。因此,最适合用于链接,引用其他样式表或可能最常见的是图像。
https://codex.wordpress.org/Function_Reference/get_stylesheet_directory_uri
get_template_directory_uri()
还返回一个URI...并检查SSL。它们都很有用,但在这种情况下切换到 get_stylesheet_directory_uri()
更有意义,因为OP正在使用子主题。 - rnevius