一些特殊情形下,例如部署了 V2ray流量伪装 和 trojan 的服务器上,WordPress网站无法直接监听443端口,只能通过代理转发。这是WordPress位于代理后的情形,通常会遇到资源不能加载、循环重定向的问题。经过一番研究,本文给出几种解决办法。
WordPress通过Nginx反代
假设WordPress以http方式监听服务器上的8080端口,Nginx监听443端口,WordPress网站要求以 https://域名 的形式访问,Nginx配置里直接 proxy_pass
会遇到两个问题:
- WordPress网站的css、js、图片等资源无法加载,浏览器控制台报“mixed content”的错误。这是因为网站以https形式访问,而WordPress页面的资源是http形式,因此浏览器拒绝加载;
- 登录WordPress管理后台,出现循环重定向,导致登录页和管理后台都无法打开。
经过分析,问题出现的原因分别为:
- WordPress不知道网站通过https访问,因此页面中输出的链接是http形式;
- 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
。
感谢博主,Nginx循环重定向问题终于解决了,原来header上加上请求协议和端口就好了
感谢博主,问题终于解决了
请问有xray和wordpress共存的方案吗?我使用了xary的一键脚本,发现和xray的进程和nginx共用了443端口,导致nginx无法启动,这个和trojan是类似的情况吗?
应该有兼容xray的wp一键脚本,自己去找找吧
使用index.php模式可以生效
使用index.php可以,但可能更新后会覆盖
你好,我的wordpress是这样设置的:
trojan监听443转发8080
nginx设置监听8080
加入location ~ \.php$ {
fastcgi_param HTTPS “on”;
fastcgi_param SERVER_PORT 443;
}
并且systemctl reload nginx 了
访问https页面还是显示http与https mix
fastcgi_param在include后面吗?