首页 > 解决方案 > 在 Symfony 中为通过 SSH 本地端口转发发送的请求获取客户端端口号

问题描述

这可能不是 Symfony 特有的,因为客户端端口号在$_SERVER超全局中不可见。

有时,我使用 SSH 本地端口转发来预览位于私有子网(无法从 Internet 访问)中的 AWS ElasticBeanstalk 应用程序。

 $ ssh -L 8088:helloworld.eu-west-1.elasticbeanstalk.com:80 bastion

bastion主机位于公共子网中,并且可以向私有子网中的服务器发出 HTTP 请求。

当我运行此命令时,我可以访问该站点http://localhost:8088/

这很好用,除非站点的一部分需要端口号——至少在 Symfony 中是这样。当部分站点因为需要身份验证而引发 403 Forbidden 响应时,Symfony 将执行重定向到登录页面,使用Symfony\Component\Security\Http\HttpUtils::createRedirectResponse().

它尝试重定向到使用$requst->getSchemeAndHttpHost()作为基础的 URL。但是,这会删除端口号,因为它已确定端口是80而不是8088.

检查$_SERVERXdebug 中的值显示:

HTTP_X_FORWARDED_PORT = 80 HTTP_X_FORWARDED_FOR = 10.0.0.48 HTTP_HOST = localhost SERVER_PORT = 80 SERVER_ADDR = 10.0.2.70 REMOTE_PORT = 44348 REMOTE_ADDR = 10.0.3.215

原始请求中的端口号8088在任何地方都不可见。

标签: phpsymfonyportforwarding

解决方案


Symfony(实际上是 Webserver)无法获取您的本地地址,有两种可能的方法来解决这个问题:

  1. 通过公共网络上的反向代理使专用网络可访问。
  2. 在您的工作机器(如 nginx)上设置反向代理,以便它接受域请求,向传入请求workproject.local添加标头,并通过隧道传递这些请求。X-Forwarded-ForX-Real-Ip

无论如何,您还必须将 symfony 配置为在反向代理下工作,有关更多信息,请阅读官方文档: 如何将 Symfony 配置为在负载均衡器或反向代理后面工作


推荐阅读