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
发表回复