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


Urls of a symfony app running behind a reverse proxy

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

我正在为一个大型组织构建这个web应用程序,该组织的服务器上运行着很多其他web应用程序。当我最终完成开发阶段时,他们让我给他们发送一个虚拟机,其中所有的东西都配置好并准备好运行(web应用程序,apache,数据库等),并且,通过某种我不知道的魔法(他们谈到了反向代理),他们将使世界可以访问它。

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

现在,这确实将外部请求重定向到我的虚拟机中运行的web服务器。问题是,我的symfony应用程序正在生成相对于虚拟机中的web服务器的所有url,它运行在根目录("/")上。但是,用户访问的实际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应用程序正确地吐出url,这将会更容易。

所以,在我(可能错误地)要求IT在他们的代理中做一些事情之前,有没有一种方法可以在我的虚拟机中解决这个问题?我读了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没有运气。

所以,简而言之,我完全没有头绪,所以任何想法都会很感激。

我自己也遇到过类似的问题。在这种情况下,url重写不会有帮助,因为symfony根据app.php脚本位置从$_SERVER变量获取基本路径。REQUEST_URI将是/fakedirectory/,而SCRIPT_NAME将是/app.php,因此基本路径将成为/, fakedirectory将被视为symfony路由器路径。

解决方案:

创建一个伪目录符号链接。在web目录下运行ln -s . fakedirectory

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

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

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