如何强制https为prod但http为dev环境?

时间:2014-04-22 15:43:19

标签: php symfony https routing

我有一个symfony2应用程序。

在prod服务器上,我希望我的所有路由都通过https进行,而在dev中,我希望能够使用http。我如何单独使用symfony2实现这一目标?我不想触摸网络服务器配置。

我尝试在routing.yml

中添加此内容
myBundle:
    resource: "@MyBundle/Controller/"
    type:     annotation
    prefix:   /
    schemes:  [https]

在我的routing_dev.yml中有这个:

myBundle:
    resource: "@MyBundle/Controller/"
    type:     annotation
    prefix:   /
    schemes:  [http]

_main:
    resource: routing.yml

即使在开发模式下,它仍然希望转到https。

4 个答案:

答案 0 :(得分:63)

您可以为此定义参数。在app/config/config.yml中定义:

parameters:
    httpProtocol: http

然后在app/config/config_prod.yml

parameters:
    httpProtocol: https

并在routing.yml更改为:

myBundle:
    resource: "@MyBundle/Controller/"
    type:     annotation
    prefix:   /
    schemes:  ['%httpProtocol%']

清除缓存(prod和dev),它应该可以工作。

答案 1 :(得分:2)

更改你的app.php最后一行如下:

if ($request->getScheme() === 'http') {
    $urlRedirect = str_replace($request->getScheme(), 'https', $request->getUri());
    $response = new RedirectResponse($urlRedirect);
} else {
    $response = $kernel->handle($request);
}

$response->send();

$kernel->terminate($request, $response);

答案 2 :(得分:1)

我的第一个解决方案运行正常,但是应该注意不要覆盖routing_dev.yml中自己的一条路线。在文件的最后,我有

_main:
    resource: routing.yml

所以我的所有捆绑路由都改回了https-scheme。订购条目,以便我的自定义条目最后解决问题。

答案 3 :(得分:-2)

我认为您可以在app_dev.php文件中检查该方案,并根据该方案将其重定向到https

$url = parse_url($_SERVER['HTTP_REFERER']);
if ($url['scheme'] == 'http') {
   header("Location: https://{$_SERVER['SERVER_NAME']}{$_SERVER['PHP_SELF']}");
}

或者可以在.htaccess中对{<1}}中的某些更改应用于网址