我有一个 Symfony 2 网站,在开发中运行在 HTTP 上,在生产中运行在 HTTPS 上。
我注意到在生产中,Symfony 生成的 URL 仍然全部呈现为 HTTP。
我怎么也可以;
- 让框架采用当前提供网站的协议(可能是首选)?
- 或者,仅在生产中强制整个网站采用 HTTPS 模式?
@A.L 和 @AndreySobkanyuk 给出的两个解决方案都是有效的,但不适用于我遇到的问题。
@A.L 和 @AndreySobkanyuk 给出的两种解决方案的问题是 Symfony 2 正在尝试进行重定向。 IE。如果通过在路由配置中以不同方式指定的协议(例如 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 路由级别上强制使用该协议,会导致无限重定向循环,即;
- 您通过 HTTPS 访问 URL。
- 负载均衡器将请求作为 HTTP 传递到 Web 服务器。
- 在 Symfony 中,路由配置为使用 HTTPS,这会导致 PHP 级别的重定向。
- 返回到1(无限循环)。
为了解决我的问题,我必须让我的网络服务器知道我的网站在 HTTPS 中运行。按照上面给出的说明进行操作如何配置 Symfony 在负载均衡器或反向代理后面工作 http://symfony.com/doc/current/cookbook/request/load_balancer_reverse_proxy.html我的页面能够解决问题,即我的网络服务器现在提供了正确的标头信息,并且现在正在生成正确的 URL。
将所需标头从负载均衡器传递到 Web 服务器的最简单方法是将以下行添加到您的web/app.php
:
Request::setTrustedProxies(array($request->server->get('REMOTE_ADDR')));
请注意,上述内容可能不是适合您的特定配置的最佳解决方案。请参阅文档了解可能更适合您的设置的其他方法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)