WordPress位于代理后的问题及解决办法

本文复制咱贴自https://itlanyan.com/wordpress-behind-proxy/#bnp_i_3

wordpress再经过反代后,会遇到后台循环重定向,静态资源不能正常加载等情况,以下为解决参考办法

WordPress通过Nginx反代

假设WordPress以http方式监听服务器上的8080端口,Nginx监听443端口,WordPress网站要求以 https://域名 的形式访问,Nginx配置里直接 proxy_pass 会遇到两个问题:

  1. WordPress网站的css、js、图片等资源无法加载,浏览器控制台报“mixed content”的错误。这是因为网站以https形式访问,而WordPress页面的资源是http形式,因此浏览器拒绝加载;
  2. 登录WordPress管理后台,出现循环重定向,导致登录页和管理后台都无法打开。

经过分析,问题出现的原因分别为:

  1. WordPress不知道网站通过https访问,因此页面中输出的链接是http形式;
  2. WordPress获取到的信息是端口为8080,而站点设置的端口是443,因此循环重定向。

知道了原因,解决办法就有了。具体操作是:Nginx转发时,告诉后端通信协议是https;告诉后端访问端口是443。

下面给出Nginx反向代理的关键配置:

location / {
        # 一些其他设置

        # 关键设置
        proxy_set_header      X-Forwarded-Proto https;
        proxy_set_header      X-Forwarded-Port 443;
        # 转发到后端
        proxy_pass http://localhost:8080;
    }

WordPress位于trojan后面

如果参考 trojan伪装建站 的操作,会遇到与上述情形不同的问题:trojan转发基于tcp实现,不能设置头部,甚至不能告诉后端用户的真实ip。

前端给不了后端想要的东西,只能自己解决。分析上面的问题和原理,其实只要让WordPress知道用https和443端口就可以了。所以一个可行、简单的办法是在WordPress中直接设置这两个值。操作为:编辑WordPress的 index.php 或 wp-config.php 文件,在文件开头放入如下两句话:

$_SERVER["HTTPS"] = "on";
$_SERVER["SERVER_PORT"] = 443;

index.php 可能在升级时被覆盖,因此建议放在 wp-config.php 文件里。

如果8080端口的WordPress用的Nginx,也可以在Nginx里设置。即转发到后端php-fpm时设置fastcgi变量:

fastcgi_param HTTPS "on";
fastcgi_param SERVER_PORT 443;

修改好后重新加载Nginx:systemctl reload nginx

参考

  1. The trick to get your wordpress behind a reverse proxy
此条目发表在wordpress分类目录。将固定链接加入收藏夹。

发表回复

您的电子邮箱地址不会被公开。