我喜欢在反向代理后面运行Symfony 5应用程序,该代理提供以下端点:
https://my.domain/service1/
代理配置基本上是这样的:
ProxyPass /marketsy/ http://internal.service1/
字符串
在反向代理连接到的服务器上,我使用以下apache规则来服务我的Symfony应用程序:
<VirtualHost *:80>
ServerName internal.service1
DocumentRoot /webroot/service1/public
<FilesMatch \.php$>
SetHandler proxy:unix:/run/php/php7.2-fpm-ui.sock|fcgi://localhost
SetEnvIfNoCase ^Authorization$ "(.+)" HTTP_AUTHORIZATION=$1
SetEnv HTTP_X_FORWARDED_PROTO "https"
</FilesMatch>
<Directory /webroot/service1/public>
AllowOverride None
Require all granted
FallbackResource /index.php
</Directory>
<Directory /webroot/service1/public/bundles>
FallbackResource disabled
</Directory>
</VirtualHost>
型
应用程序本身是可重访问的,但Symfony无法处理“service1”路径前缀。
例如,它试图访问https://my.domain/_wdt/8e3926而不是https://my.domain/service1/_wdt/8e3926下的分析器,并且在根路由旁边,所有路由都不起作用:
例如:当我尝试访问https://my.domain/service1/my/page时,我将被重定向到https://my.domain/my/page
现在我的问题是,我如何配置Symfony知道“service1”路径前缀时,生成的网址ets。
3条答案
按热度按时间wgmfuz8q1#
正确的做法(示例):
创建
src/Controller/BarController.php
字符串
src/Controller/FooController.php
型
创建
config/routes/prefix-routes.yaml
型
并编辑路由
config/routes.yaml
-删除其内容,只需放入:型
所有的控制器现在都可以在url上使用:
型
如果你想让你的分析器也使用
service1
前缀,那么可以这样编辑config/routes/dev/web_profiler.yaml
:型
现可于下列地点索取:
型
为注解添加前缀:
创建控制器
src/Controller/AnnoController.php
:型
编辑
config/routes/annotations.yaml
并添加prefix: service1
:型
现在前缀被添加到通过注解完成的路由中:
型
一些参考资料:
Symfony路由前缀
Symfony Routing Configuration Keys
添加前缀快速和肮脏的解决方法,将前缀
service1
添加到所有路由(不推荐)。而不是像上面那样更改路由,只需编辑
src/Kernel.php
protected function configureRoutes
并通过在末尾添加
->prefix('service1')
来更改每一个$routes->import
行,因此它看起来是这样的:型
所有的控制器现在都可以在url上使用:
型
以及分析器:
型
k3fezbri2#
除了@Jimmix提供的解决方案之外,我还必须编写一个订阅者来为我的请求路径添加前缀:
字符串
vuktfyat3#
从Symfony 5.3开始,不需要事件订阅者手动修改请求路径或更改路由前缀,因为symfony现在支持
X-Forwarded-Prefix
HTTP头。当反向代理将此头传递给symfony应用程序时,Request对象的基本URL将被正确设置,并且所有生成的路径都会自动添加前缀。在apache中,你可以使用
mod_header
来添加header,方法是在vhost配置中添加一个RequestHeader set X-Forwarded-Prefix "/marketsys"
(或类似)指令。如果您想使用此功能,请确保将
X-Forwared-Prefix
配置为可信头。