wordpress+ngrok反向代理

ngrok要求 Host 值为 {通道名}.ngrok.{一级域名}.com:8081 ,其中8081是端口号,如非这样设置,nginx客户端无法代理后端站点,会提示:通道不存在。

proxy_set_header Host tunnel.ngrok.somename.com:8081;

巧了,wordpress 的 wp-app/wp-includes/canonical.php 中有这样一段代码:

if ( ! $requested_url && isset( $_SERVER['HOST'] ) ) {
		// Build the URL in the address bar.
		
		$requested_url  = is_ssl() ? 'https://' : 'http://';
		$requested_url .= $_SERVER['HOST'];
		$requested_url .= $_SERVER['REQUEST_URI'];
	}
这导致wordpress 接收到的域名正是 {站点前缀}.ngrok.{一级域名}.com:8081 ,所以首页会被代理到这上面去,而我们的前端域名必须是 www.xx.com这样漂的一级www域名,这就导致从www访问的wordpress总是重定向到 ngrok 的后端域名,不但难看,而且它还忽略了端口号,最终访问的是 ngrok 服务器的80端口,那肯定是个403,大写的“滚粗”。
解决方案是在 nginx 前端代理中,设置:
proxy_set_header X-Forwarded-Host www.xxx.com;
代表,它是为此转发。
同时修改 wp-app/wp-includes/canonical.php中的对应部分为:

if ( ! $requested_url && isset( $_SERVER['HTTP_X_FORWARDED_HOST'] ) ) {
		// Build the URL in the address bar.
		
		$requested_url  = is_ssl() ? 'https://' : 'http://';
		$requested_url .= $_SERVER['HTTP_X_FORWARDED_HOST'];
		$requested_url .= $_SERVER['REQUEST_URI'];
	}
注意,这里要使用 HTTP_X_FORWARDED_HOST ,而不是 单纯的 X-Forwarded-Host


已发布

分类

作者:

标签

评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注