如何强制 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