如何强制 https 用于 prod 但 http 用于开发环境?

Posted

技术标签:

【中文标题】如何强制 https 用于 prod 但 http 用于开发环境?【英文标题】:How to force https for prod but http for dev environment? 【发布时间】: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。

【问题讨论】:

In Symfony, how can I require http in a dev environment and https in production?的可能重复 【参考方案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了

以上是关于如何强制 https 用于 prod 但 http 用于开发环境?的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式适用于 regex101.com,但不适用于 prod

如何使用 Apache 在特定页面上正确强制使用 HTTPS

nginx 强制 https 适用于 www.example.com 但不适用于 example.com

如何在 Express.js 中强制 SSL / https

PlayFramework HTTPS 仅在 prod 模式下路由,HTTP 在 dev 模式下

在可能存在多个选项的情况下,如何创建策略以强制标记?