我有一个Symfony 2网站,在开发中运行HTTP或在生产中运行HTTPS。
我注意到在生产环境中,Symfony生成的URL仍然都是以HTTP渲染的。
我应该如何做:
- 让框架采用当前网站所使用的协议(可能更好)?
- 或者,在生产中强制将整个网站设置为仅使用HTTPS模式?
@A.L和@AndreySobkanyuk提供的两种解决方案都是有效的,但不适用于我遇到的问题。
问题在于@A.L和@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路由级别上强制协议会导致无限重定向循环,即:
要解决我的问题,我必须让我的Web服务器意识到我的网站以HTTPS运行。按照如何配置Symfony在负载均衡器或反向代理后工作页面上的说明,我能够解决问题,即现在我的Web服务器正在接收正确的头信息并生成正确的URL。
将所需的标头从负载均衡器传递到Web服务器的最简单方法是将以下行添加到web/app.php
文件中:
Request::setTrustedProxies(array($request->server->get('REMOTE_ADDR')));
请注意,以上可能不是您特定配置的最佳解决方案。请参阅文档以了解其他更适合您设置的方法。
resource
检查了schemes:[https]
,对我来说效果很好。 - chapay{{ url() }}
生成的 URL 都是基于 https
的。 - chapayhttp
的URL时,Symfony
会尝试重定向您。但是,正如我已经说过的,如果您使用我的解决方案,则使用url()
扩展生成的URL必须基于https
。如果您的URL不是基于https
的,则您正在错误地操作。 - chapay我在使用nginx时发现这对我很有用。
将以下行添加到nginx fcgi参数中,这是必需的,因为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/
为了在您的生产环境中强制使用HTTPS
,您可以使用以下配置:
In your app/config/routing.yml
:
acme_hello:
resource: "@AcmeHelloBundle/Resources/config/routing.yml"
schemes: [https]
In your add app/config/routing_dev.yml
:
_main:
resource: routing.yml
schemes: [http]
if you want to force HTTP
for all your routes in development environment.
And in your @AcmeHelloBundle/Resources/config/routing.yml
you can place all your routes.
想要了解更多关于schemes: [https]
和其他使其工作的方法,您可以查看Symfony文档。
REMOTE_ADDR
(即使用mod_rpaf
apache扩展)(当然,在这种情况下,您无法使用trusted_proxies
值)您可以在Web服务器上设置HTTPS环境变量,以X-FORWARDED-PROTO标头值为索引,强制Symfony使用https协议。
在Apache中:
SetEnvIf x-forwarded-proto https HTTPS=on
如果您想在反向代理/负载均衡器后面使用https,并且希望twig渲染的url/资源也使用https方案,则需要同时转发scheme和port。
例如反向代理app.php
Request::setTrustedProxies(array('127.0.0.1), Request::HEADER_X_FORWARDED_ALL);
proxy_pass http://localhost:6081;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Port 443;
twig
<script src="{{ asset('build/common.js') }}"></script>
将会是<script src="https://www.example.com/build/common.js"></script>
parameters:
auth_required_channel: 'http'
app/config/config_prod.yml
parameters:
auth_required_channel: 'https'
app/config/security.yml
然后使用该参数来要求HTTP或HTTPS通道(Symfony2文档):
security:
[...]
access_control:
[...]
- { path: ^/admin, roles: ROLE_ADMIN, requires_channel: %auth_required_channel% }
http://...
重定向到 https://...
。 - A.L- { path: ^/, requires_channel: %auth_required_channel% }
?很难确定,没有查看您的 security.yml
文件,请在您的问题中添加您的配置。 - A.L
{{ path() }}
吗? - A.L{{ url(' ... ') }}
。 - Luke