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

Luk*_*uke 10 php https http symfony

我有一个Symfony 2网站,可以在开发中的HTTP上运行,也可以在生产中的HTTPS上运行.

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

我怎么能;

  1. 让框架采用当前提供网站的协议(可能是首选)?
  2. 或者,仅在生产中强制整个网站采用HTTPS模式?

Luk*_*uke 11

@AL和@AndreySobkanyuk给出的两种解决方案都是有效的,但不适用于我遇到的问题.

@AL和@AndreySobkanyuk提供的两种解决方案的问题在于Symfony 2正在尝试重定向.即,如果通过协议(例如HTTP)访问URL(在路由配置中以不同方式指定(例如HTTPS)),Symfony 2将执行重定向(在PHP级别).

在我的情况下,URL重写发生在Web服务器级别(Apache),因为我的网站将所有URL都作为HTTPS提供.

我正在处理的问题是我的模板中生成的URL都是使用HTTP协议呈现的,如果它们应该是HTTPS.我假设有一种方法告诉Symfony每当它呈现一个URL,用HTTPS而不是HTTP作为前缀.不幸的是,没有(或者至少,我没有意识到).

由于我的网站在负载均衡器后面运行,我的Web服务器不知道它应该将URL呈现为HTTPS,因为负载均衡器和Web服务器之间的内部连接是HTTP.这意味着从Symfony的角度来看,所有请求都是使用HTTP进行的,并且通过在Symfony路由级别强制协议,它导致无限重定向循环,即;

  1. 您通过HTTPS点击了一个URL.
  2. 负载均衡器将请求作为HTTP传递给Web服务器.
  3. 在Symfony中,路由配置为使用HTTPS,从而导致PHP级别的重定向.
  4. 回到1(无限循环).

为了解决我的问题,我必须让我的网络服务器知道我的网站在HTTPS中运行的事实.按照如何在负载均衡器或反向代理页面后面如何配置Symfony工作的说明我能够解决问题,即我的Web服务器现在正在提供正确的头信息,现在生成正确的URL .

将所需标头从负载均衡器传递到Web服务器的最简单方法是将以下行添加到web/app.php:

Request::setTrustedProxies(array($request->server->get('REMOTE_ADDR')));
Run Code Online (Sandbox Code Playgroud)

请注意,上述可能不是您特定配置的最佳解决方案.有关可能更适合您的设置的其他方法,请参阅文档.


par*_*sss 6

我发现这对我的情况有用(使用nginx)

添加到nginx fcgi params以下行,这是必需的,因为Symfony2依赖于此变量,由Web服务器传递给PHP,以生成正确的URL.Apache默认执行此操作,但nginx需要此特殊配置.

fastcgi_param HTTPS on;

http://blog.servergrove.com/2011/04/04/symfony2-quick-tip-generateurl-with-https-on-nginx/


cha*_*pay 5

要强制HTTPS进入生产环境,可以使用以下配置:

  1. 在你的app/config/routing.yml:

    acme_hello:
        resource: "@AcmeHelloBundle/Resources/config/routing.yml"
        schemes: [https]
    
    Run Code Online (Sandbox Code Playgroud)
  2. 在你的添加中app/config/routing_dev.yml:

    _main:
        resource: routing.yml
        schemes: [http]
    
    Run Code Online (Sandbox Code Playgroud)

    如果你想强制HTTP开发环境中的所有路由.

  3. 在你的@AcmeHelloBundle/Resources/config/routing.yml你可以放置你所有的路线.

有关schemes: [https]使其工作的更多信息和其他方法,您可以查看Symfony文档.