修改Symfony2路由,以使用应用程序名称预先发送所有请求


Modify Symfony2 routing to prepend all requests with application name

我想在一台Apache服务器上托管同一个Symfony2应用程序的两个实例。每个应用程序都应该这样处理:

http://myserver/app1/http://myserver/app2/

为此,我在Apache中设置了两个基于端口的虚拟主机,第三个在端口80上,将文件夹请求重定向到适当的vhosts:

<VirtualHost *:80>
    DocumentRoot /var/www
    RewriteEngine On
    RewriteCond %{REQUEST_URI} ^/app1/(.*)$
    RewriteRule ^ http://%{HTTP_HOST}:9999/%1 [L]
    RewriteCond %{REQUEST_URI} ^/app2/(.*)$
    RewriteRule ^ http://%{HTTP_HOST}:8888/%1 [L]
</VirtualHost>
<VirtualHost *:9999>
    DocumentRoot /var/www/app1/web    
    <Directory /var/www/app1/web>   
    </Directory>
</VirtualHost>
<VirtualHost *:8888>
    DocumentRoot /var/www/app2/web        
    <Directory /var/www/app2/web>
    </Directory>
</VirtualHost>

这非常适合http://myserver/app1/被重定向到http://myserver:9999和http://myserver/app2/被重定向到http://myserver:8888(浏览器中的URL发生更改(。我希望web浏览器中的URL保持为http://myserver/app1或http://myserver/app2.我可以通过在RewriteRule中添加开关"P"来实现这一点,如下所示:

RewriteRule ^ http://%{HTTP_HOST}:9999/%1 [L,P]

然而,这会产生问题,因为现在Symfony看到所有来自端口80的请求,并将它们重定向回该端口,而不是正确的虚拟主机。我认为解决这个问题的一种方法是强制Symfony2使用正确的应用程序名称预处理所有请求。我试图通过修改vendor''symfony''symfony ''src''symfony''Bundle''FrameworkBundle''Controller''Controller.php中的generateUrl方法来做到这一点,使其始终在生成的URL前面添加应用程序名称,这只适用于页面请求(例如,缺少资产(。

所以我的问题是,是否有办法让Symfony认为所有请求都应该返回到正确的"应用程序"URL?

我的建议是,不要试图通过Apache配置来实现这一点。您可以将每个Symfony应用程序配置为位于子文件夹中,请参阅:http://www.yegods.it/2015/01/30/install-symfony-app-in-a-subfolder-of-an-existing-site/

您只需要编辑app.phpapps_dev.phpcomposer.json(用于资产(。