Php 如何让Symfony 2采用协议方案(http与https)
我有一个Symfony 2网站,它要么在开发中运行HTTP,要么在生产中运行HTTPS 我注意到,在生产中,Symfony生成的URL仍然全部呈现为HTTP 我怎么能这样呢Php 如何让Symfony 2采用协议方案(http与https),php,http,symfony,https,Php,Http,Symfony,Https,我有一个Symfony 2网站,它要么在开发中运行HTTP,要么在生产中运行HTTPS 我注意到,在生产中,Symfony生成的URL仍然全部呈现为HTTP 我怎么能这样呢 让框架采用当前的协议来服务网站(可能是首选) 或者,强制整个网站仅在生产中使用HTTPS模式 要在生产环境中强制使用HTTPS,可以使用以下配置: 在您的app/config/routing.yml中: acme_hello: resource: "@AcmeHelloBundle/Resources/config/
要在生产环境中强制使用
HTTPS
,可以使用以下配置:
app/config/routing.yml
中:
acme_hello:
resource: "@AcmeHelloBundle/Resources/config/routing.yml"
schemes: [https]
_main:
resource: routing.yml
schemes: [http]
app/config/routing\u dev.yml
中:
acme_hello:
resource: "@AcmeHelloBundle/Resources/config/routing.yml"
schemes: [https]
_main:
resource: routing.yml
schemes: [http]
若要在开发环境中强制所有路由使用HTTP
@AcmeHelloBundle/Resources/config/routing.yml
中,您可以放置所有路由有关
方案的更多信息:[https]
以及其他使其工作的方法,您可以查看。我使用此解决方案强制HTTP或https:
我在不同的环境配置文件中定义了%auth\u required\u channel%
值:
app/config/config_dev.yml和app/config/config_test.yml
参数:
所需的身份验证通道:“http”
app/config/config_prod.yml
参数:
需要验证的频道:“https”
app/config/security.yml
然后,此参数用于要求HTTP或HTTPS通道():
安全性:
[...]
访问控制:
[...]
-{路径:^/admin,角色:角色\管理员,需要\通道:%auth\需要\通道%}
(改编自A)由@A.L和@andreysobkanuk给出的两种解决方案都是有效的,但不适用于我遇到的问题 @A.L和@andreysobkanuk给出的两种解决方案的问题是Symfony 2正在尝试重定向。也就是说,如果URL是通过协议(例如HTTP)访问的,而在路由配置中,协议的指定方式不同(例如HTTPS),Symfony 2将执行重定向(在PHP级别) 在我的情况下,URL重写发生在web服务器级别(Apache),因为我的网站将所有URL作为HTTPS服务 我要处理的问题是,在我的模板中生成的URL都是使用HTTP协议呈现的,如果它们应该是HTTPS的话。我假设有一种方法可以告诉Symfony,每当它呈现一个URL时,就用HTTPS而不是HTTP作为前缀。不幸的是,没有(或者至少我没有意识到) 由于我的网站运行在负载平衡器之后,我的web服务器没有意识到它应该将URL呈现为HTTPS,因为负载平衡器和web服务器之间的内部连接是HTTP。这意味着,从Symfony的角度来看,所有请求都是使用HTTP发出的,通过在Symfony路由级别强制协议,它导致了无限重定向循环,即
web/app.php
:
Request::setTrustedProxies(array($request->server->get('REMOTE_ADDR')));
请注意,对于您的特定配置,上述可能不是最佳解决方案。请参阅文档以了解可能更适合您的设置的其他方法。我发现这对我的案例很有用(使用nginx) 在nginx fcgi params中添加以下行,这是必需的,因为Symfony2依赖于此变量(由web服务器传递给PHP)来生成正确的URL。Apache默认情况下会这样做,但是nginx需要这个特殊的配置
fastcgi_param HTTPS on代码>
假设这种情况:
- 您的Symfony应用程序位于Varnish或BigIP等反向代理之后
- 您希望将原始客户端IP用作
远程地址(即使用mod\u rpaf
apache扩展)(当然,在这种情况下,您不能使用trusted\u代理
值)
您可以在Web服务器中设置HTTPS环境变量,该变量以X-FORWARDED-PROTO头值为索引,以强制Symfony使用HTTPS协议
在Apache中:
SetEnvIf x-forwarded-proto https HTTPS=on
Ho深入研究后,如果您想在https方案中的反向代理/负载平衡器和细枝呈现url/资产后面使用https,则必须同时转发方案和端口
反向代理app.php示例
Request::setTrustedProxies(数组('127.0.0.1),Request::HEADER\u X\u FORWARDED\u ALL);
小枝
将
正常。那可能行得通。但是,如您所示,将其添加到资源中时,似乎对我不起作用(缓存已清除)。这肯定是必须由框架配置控制的东西,而不是单个捆绑包。@Luke the Symfony2 doc说Symfony将自动生成一个绝对URL,使用HTTPS作为方案,它对您有效吗?那么,另一个带有HTTP[…]的句子路径将自动重定向到带有HTTPS方案的相同URL[…]呢?不幸的是,这似乎对我不起作用。我开始怀疑这可能是因为我在一个负载平衡器或其他东西后面。请理解,这并不是说该网站不能在HTTPS上工作,而是这样。只是模板中生成的URL是HTTP,而它们应该是HTTPS。这只会在安全端点上强制协议。我需要一个执行者