php - 在 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
.
检查$_SERVER
Xdebug 中的值显示:
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
在任何地方都不可见。
解决方案
Symfony(实际上是 Webserver)无法获取您的本地地址,有两种可能的方法来解决这个问题:
- 通过公共网络上的反向代理使专用网络可访问。
- 在您的工作机器(如 nginx)上设置反向代理,以便它接受域请求,向传入请求
workproject.local
添加标头,并通过隧道传递这些请求。X-Forwarded-For
X-Real-Ip
无论如何,您还必须将 symfony 配置为在反向代理下工作,有关更多信息,请阅读官方文档: 如何将 Symfony 配置为在负载均衡器或反向代理后面工作
推荐阅读
- r - geom_errorbar 和 geom_ribbon 一起工作
- vim - vimscript - 自动捕捉窗口调整大小(是否使用自动命令)
- javascript - 在 Javascript 中有效地逐步过滤大型数据集
- reactjs - 视频源不会在 useState() 上更新
- .net - 是否可以将测试项目添加到针对 .NET 5.0 的 WPF 解决方案?
- iterm2 - iTerm2 - 选择窗口时选择窗格
- javascript - Google 表格:复制单元格并在另一个选项卡中对其进行排序
- c++ - 如何将结构放置到 std::unordered_map 中?
- android - Android highcharts 显示单条目条形图
- spring-boot - 使用 JWTTokenValidator 验证 Okta 令牌时遇到问题