Php 如何让Symfony 2采用协议方案(http与https)

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/

我有一个Symfony 2网站,它要么在开发中运行HTTP,要么在生产中运行HTTPS

我注意到,在生产中,Symfony生成的URL仍然全部呈现为HTTP

我怎么能这样呢

  • 让框架采用当前的协议来服务网站(可能是首选)
  • 或者,强制整个网站仅在生产中使用HTTPS模式

  • 要在生产环境中强制使用
    HTTPS
    ,可以使用以下配置:

  • 在您的
    app/config/routing.yml
    中:

    acme_hello:
        resource: "@AcmeHelloBundle/Resources/config/routing.yml"
        schemes: [https]
    
    _main:
        resource: routing.yml
        schemes: [http]
    
  • 在add
    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路由级别强制协议,它导致了无限重定向循环,即

  • 您通过HTTPS访问URL
  • 负载平衡器将请求作为HTTP传递给web服务器
  • 在Symfony中,路由被配置为使用HTTPS,这会导致PHP级别的重定向
  • 返回到1(无限循环)
  • 为了解决我的问题,我必须让我的web服务器知道我的网站是以HTTPS运行的。按照页面上给出的说明,我可以解决问题,也就是说,我的web服务器现在提供了正确的标题信息,并且正在生成正确的URL

    将所需的头从负载平衡器传递到web服务器的最简单方法是将以下行添加到
    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。这只会在安全端点上强制协议。我需要一个执行者