WordPress中的get_template_directory_uri()返回http而不是https

18
我们最近在网站上应用了 SSL 证书,希望所有的 URL 都使用 https:// 协议。
当我们将网站转换为 https:// 后,由于仍有一些资源指向 http://,导致我们的网站崩溃。经过一段时间的研究,我发现 get_template_directory_uri() 函数始终返回 http://,即使我们的 wp_home 和 wp_site_url 已经设置为 https://。
是否还有其他地方需要更改 URL?因为我们正在使用子主题,而该函数获取父主题目录。
谢谢, Raju Vishwas

你设置了“WP_CONTENT_URL”为什么?我倾向于在wp-config.php中设置https的内容 - 如果有帮助的话,我可以给你我的完整设置。 - Simon Pollard
当然,让我来查一下。 - Raju Vishwas
你能解决这个问题吗? - BTR Naidu
@Simon Pollard,我知道这是很久以前的事情了,但现在我也面临着同样的问题,你能给我一些线索,告诉我如何更新我的wp-config.php文件来解决这个问题吗?谢谢!!! - Dimentica
1
检查服务器是否返回HTTPS,在我的情况下,我们使用的是负载均衡器服务器,并且SSL证书安装在负载均衡器上,因此我的Apache始终返回http而不是https,我不得不硬编码以返回https。 - Raju Vishwas
@RajuVishwas 我也遇到同样的问题(使用负载均衡器)...您能告诉我怎么“硬编码”返回 https 吗?谢谢! - ChangeTheWay
7个回答

13

1
它是 $_SERVER['HTTPS']。 - Juergen Schulze
{btsdaf} - pbond

7

根据发起者添加的评论:

在我的情况下,我们使用负载均衡服务器,并且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';

我要感谢这篇文章,它让我找到了正确的方向。

4

查看链接的注释 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';

2
为了帮助 OP 解决当前的问题,可以在答案中添加一些解释说明。 - ρяσѕρєя K

4

这个方法对我非常有效,在wp-config文件的结尾添加如下内容:

define('FORCE_SSL_ADMIN', true);
define('WP_HOME', 'https://' . $_SERVER['HTTP_HOST']);
define('WP_SITEURL', WP_HOME);

谢谢,这已经足够修复它了。 - Kamil B.

0

你尝试过使用修改后的 .htaccess 文件通过 https 强制传输内容吗?

以下是我正在使用的代码片段:

#Force HTTPS
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

0

检查已安装的插件列表。任何涉及缓存、CDN等的插件可能会干扰get_template_directory_uri。在我们的案例中,客户安装了大量插件,以期加快网站速度。

没有启用任何插件时,https加载正常。因此,只需要找出是哪个插件造成的问题。而在有问题的插件设置中,存在一个http版本的站点路径。


-2

1
get_template_directory_uri() 还返回一个URI...并检查SSL。它们都很有用,但在这种情况下切换到 get_stylesheet_directory_uri() 更有意义,因为OP正在使用子主题。 - rnevius
问题在于,我们的主题正在使用get_template_directory_uri()和get_stylesheet_directory_uri(),但仍然返回http://。 - Raju Vishwas
你的域名上安装了SSL吗? - Atif Tariq
1
你在 www.yourdomain.com/wp-admin/options-general.php 中,将两个 URL 都从 http: 改成了 https: 吗? - Atif Tariq
1
嗨Raju,请尝试这些插件: https://wordpress.org/plugins/wp-force-ssl/ https://wordpress.org/plugins/wordpress-https/ - Atif Tariq
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接