通过 nginx 和 varnish 获取正确的 SERVER_PORT 到 php-fpm

MDr*_*tte 5 nginx varnish reverse-proxy fastcgi php-fpm

目标是让 PHP 知道正确的面向 Web 的 server_port。

设置是:

nginx 在端口 443 上反向代理以在端口 80 上反向代理到端口 8008 上的 nginx 并运行 php-fpm 作为 fastcgi。

达到 80 或 443 都可以正常工作,除了 $_SERVER['SERVER_PORT'] 在 php 中默认总是显示 8008。我可以对 fastcgi_param server_port 进行硬编码,但它仅适用于 80 或 443,但不能同时适用于两者。

# default
fastcgi_param  SERVER_PORT        $server_port;
# harcode to 80
fastcgi_param  SERVER_PORT        80;
Run Code Online (Sandbox Code Playgroud)

如何获得可用于 php 的正确的面向外部的服务器端口?

MDr*_*tte 15

找到了我自己的答案

在 SSL nginx 中,这...

   proxy_set_header X-Forwarded-Proto https;
Run Code Online (Sandbox Code Playgroud)

然后在清漆中,这...

 sub vcl_recv {
   if (req.http.X-Forwarded-Proto == "https" ) {
     set req.http.X-Forwarded-Port = "443";
   } else {
     set req.http.X-Forwarded-Port = "80";
     set req.http.X-Forwarded-Proto = "http";
   }
 }
Run Code Online (Sandbox Code Playgroud)

然后在最终的 nginx 中,这...

fastcgi_param  SERVER_PORT        $http_x_forwarded_port;
Run Code Online (Sandbox Code Playgroud)