一些特殊情形下,例如部署了 V2ray流量伪装trojan 的服务器上,WordPress网站无法直接监听443端口,只能通过代理转发。这是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.phpwp-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