反向代理后面的 symfony 应用 运行 的 URL

Urls of a symfony app running behind a reverse proxy

我会尽力解释这个场景,因为它看起来有点复杂。

我正在为一个大型组织构建此 Web 应用程序,该组织的服务器中有大量其他 Web 应用程序 运行ning。当我最终完成开发阶段时,他们要求我向他们发送一个虚拟机,其中包含所有配置并准备好 运行(Web 应用程序、apache、数据库等),并且通过某种方式我不知道的魔法(他们谈到了反向代理),他们会让世界可以访问它。

所以我把机器发给了他们,他们把它放到网上 http://www.fakedomain.com/fakedirectory(注意 /fakedirectory 部分)

现在,这确实将外部请求重定向到我虚拟机中的网络服务器 运行ning。问题是我的 symfony 应用程序正在生成我所有的 urls 相对于虚拟机中的网络服务器,运行s 在根目录(“/”)上。但是,用户实际访问的 url 是 /fakedirectory。因此,例如,这就是您访问 /fakedirectory/doc.html:

时得到的结果
<html>
...
<body>
    ...
    <a href="/anotherdoc.html">A link</a>
</body>
</html>

如果用户点击 "A link" 这将导致他出现 404 错误,因为实际的 url 应该是 /fakedirectory/anotherdoc.html

据我所知,这应该通过与虚拟机进行通信的上述反向代理以某种方式解决。但是我客户组织的一位 IT 人员建议,如果我的 symfony 应用程序正确地吐出 urls 会更容易。

所以,在我(可能是错误的)要求 IT 在他们的代理中做某事之前,有没有办法在我的虚拟机中解决这个问题?我已经阅读了关于 request contexts 的 symfonys 文档,特别是这个:

# app/config/parameters.yml
parameters:
    router.request_context.host: www.fakedomain.com
    router.request_context.scheme: http
    router.request_context.base_url: fakedirectory

但这似乎并不适用于整个 symfony 的 url 系统。我还在 apache 的 mod_proxy 和 mod_rewrite 中尝试了一些奇怪的配置,但没有成功。

所以,简而言之,我完全一无所知,所以任何想法都将不胜感激。提前致谢。

我想你可以用 RewriteBase 规则解决这个问题?

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteBase /fakedirectory/web
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteRule ^(.*)$ app.php [QSA,L] 
</IfModule>

我自己 运行 遇到了类似的问题。 在这种情况下,url 重写将无济于事,因为 symfony 根据 app.php 脚本位置从 $_SERVER 变量获取基本路径。 REQUEST_URI 将是 /fakedirectory/SCRIPT_NAME 将是 /app.php 因此基本路径变为 / 并且 fakedirectory 被视为 symfony 路由器路径。

解决方案:

制作一个假目录符号链接。内部网站目录 运行 ln -s . fakedirectory

现在 REQUEST_URI 作为 /fakedirectory/ 您的 SCRITP_NAME 值将等于 /fakedirectory/app.php 并且所有资产或路由器路径将具有正确的 /fakedirectory/ 基本路径.