【问题标题】:How to force https for prod but http for dev environment?如何强制 https 用于 prod 但 http 用于开发环境?
【发布时间】:2014-06-07 02:19:38
【问题描述】:

我有一个 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。

【问题讨论】:

标签: php symfony https routing


【解决方案1】:

您可以为此定义参数。在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%']

清除缓存(产品和开发),它应该可以工作。

【讨论】:

  • 这真是个好主意!它也适用于配置security.yml
  • 对于任何想在注解中逐个使用这种情况的人来说,这就是:@Route("/register.html",schemes={"%httpProtocol%"})
  • 值得注意的是,如果您也使用了方案设置,还需要将方案设置添加到 fos_user 路由中。
【解决方案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);

【讨论】:

  • 我不想硬编码app.php 中的架构,我更喜欢在配置文件中有这样的设置以便轻松更改设置。
  • http内核运行前你没有配置文件!
  • 这并不完全正确。请查看接受的答案以及我如何让它为我工作的答案。那里不需要更改app.php。您提供了一个可行的解决方案,但我不推荐。
【解决方案3】:

我的第一个解决方案运行良好,但应注意不要在routing_dev.yml 中覆盖自己的路由。在文件的末尾,我有

_main:
    resource: routing.yml

所以我所有的捆绑路由都改回了 https 方案。对条目进行排序,以便我的自定义条目最后解决问题。

【讨论】:

  • 我尝试在我的 app/config/routing.yml 中的resource: "@MyBundle/Resources/config/routing.yml" 下设置schemes: [https],但它不起作用(它不会对我的包中定义的路由强制使用 HTTPS)。您是否尝试过在不使用type: annotation 的路线中执行您建议的操作?
【解决方案4】:

我认为您可以检查 app_dev.php 文件中的方案并基于该方案将其重定向到 https

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

或者也许可以在.htaccess 中为 URL 中的app_dev.php 应用一些更改

【讨论】:

  • 唉,这是不可能的,因为在 prod 上,http 端口被阻止,所以我无法从那里进行任何重定向,这也是我不想依赖服务器端配置但实现它的原因在 symfony2 配置中。
  • 我以为你只是想在开发模式下这样做,并且产品可以同时使用 http 和 https
  • 如果http端口被阻塞,请求怎么会到达apache,更别说symfony了
猜你喜欢
  • 1970-01-01
  • 2013-11-13
  • 1970-01-01
  • 2018-01-01
  • 2014-09-28
  • 2021-12-17
  • 2017-02-08
  • 2014-08-15
  • 1970-01-01
相关资源
最近更新 更多