【问题标题】:How to disable HTTPS or change to HTTP in dev and prod version on symfony?如何在 symfony 的 dev 和 prod 版本中禁用 HTTPS 或更改为 HTTP?
【发布时间】:2017-11-12 21:38:30
【问题描述】:

我的问题就像标题一样。

在我的项目中,我尝试将 HTTPS 添加到 /login 和 /admin 路由。两个路由都是从第三方包中导入的:从 FOSUserBundle 登录和从 EasyAdminBundle 进行管理。为了实现这一点,我将requires_channel: https 添加到security.yml 文件中,就像在这个线程https://symfony.com/doc/current/security/force_https.html 中描述的那样。
我的access_control 部分看起来像:

access_control:
    - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: https }
    - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/admin/, role: ROLE_ADMIN, requires_channel: https }


我通过内置服务器启动了该站点,以检查它是否会强制 https 连接,并且确实如此。显然有一个错误,因为 symfony 内置服务器不支持 ssl 连接,但在地址栏中有https://。我将此版本上传到服务器,我想继续开发下一个功能,所以我删除了 requires_channel 条目,但是当我通过键入 php bin/console server:start 0.0.0.0:80 并在浏览器地址栏中键入 localhost/admin 来启动页面时,交响乐仍然有效HTTPS。我的下一个猜测是将requires_channel: https 更改为requires_channel: http,但这也不起作用。
在生产服务器上也会发生同样的情况,即当requires_channel 被删除或设置为 HTTP 时,HTTPS 仍然强制执行,但我可以忍受,因为最后我将不得不在 apache 中生成证书并启动 ssl 连接配置文件,但我不能在开发版本上工作。

我寻找了类似的问题,但主要是如果线程是关于 symfony 和 HTTP 或 HTTPS,人们会问如何强制 HTTPS,但我已经这样做了。我找不到与我类似的问题,所以如果有人知道出了什么问题,请随时回复,或者如果有人已经解决了我的问题或非常类似的问题,请粘贴链接。


security.yml文件全文:

security:
    encoders:
        FOS\UserBundle\Model\UserInterface: bcrypt

    role_hierarchy:
        ROLE_ADMIN:       ROLE_USER
        ROLE_SUPER_ADMIN: ROLE_ADMIN

    providers:
        fos_userbundle:
            id: fos_user.user_provider.username_email

    firewalls:
        main:
            pattern: ^/
            form_login:
                provider: fos_userbundle
            logout:       true
            anonymous:    true

    access_control:
        - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: "%router.request_context.scheme%" }
        - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/admin/, role: ROLE_ADMIN, requires_channel: "%router.request_context.scheme%" }

【问题讨论】:

    标签: php symfony ssl https


    【解决方案1】:

    最后,我设法找到了解决问题的方法。

    由于我怀疑系统和浏览器缓存中有一些数据,虽然我正在清除 symfony 缓存,但在loginadmin 路由上仍然存在一些强制https://

    我所做的是使用BleachBit 清除所有可能的缓存,现在它可以正常工作了。

    谢谢大家的宝贵时间。

    【讨论】:

      【解决方案2】:

      在开发中没有改变的问题 - 清除 symfony 缓存。

      至于是否选择 https://,请尝试使用“%parameter%”,它肯定适用于我的 routing.yml 文件 - schemes: ["%httpProtocol%"],在 parameters.yml.dist 文件中设置 - 请务必在现场/制作中将其设置为“https” `.

      【讨论】:

      • 您好,感谢您的回复。我试图通过php bin/console cache:clear 清除缓存并从var/cache 文件夹中手动删除文件,这适用于除80 之外的每个端口。当我在端口80 上启动内置服务器时仍然得到https://
      【解决方案3】:

      扩展 Alister Bulman 的答案。

      宁可使用 'router.request_context.scheme' 参数,这样你的整个 symfony 应用程序都有正确的方案。

      最终结果是:

      access_control:
          - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: "%router.request_context.scheme%" }
          - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
          - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
          - { path: ^/admin/, role: ROLE_ADMIN, requires_channel: "%router.request_context.scheme%" }
      

      还将方案添加到您的路线中:

      main:
          type: annotation
          schemes: "%router.request_context.scheme%"
          resource: '../src/Application/Controller/'
      

      【讨论】:

      • 嗨,尝试了您的解决方案并注意到 https:// 现在仅在浏览器地址栏键入 localhost/admin 时才会强制执行,即当我运行 php bin/console server:start 0.0.0.0:80 并在每个地址栏键入 0.0.0.0 时一切正常,即使localhost/login 不再强制https://localhost/admin 仍然强制https://。我可以开始使用 ip 地址,但我习惯使用localhost。另外,我注意到在其他 symfony 项目中,localhost/admin 被强制https://
      • 您是否也将“方案”添加到您的管理路由?
      • 是的,https 仍然出现在 localhost/admin 上。我在想,也许 symfony 有一些全局变量没有在该特定路线上正确重置为 http,因为奇怪的是,在全新的项目中,localhost/admin 存在同样的问题。
      • 您能添加完整的 security.yaml 吗?
      【解决方案4】:

      我遇到了同样的问题,首先将 requires_channel: https 放入 security.yml 然后将其删除,当我连接回 http://localhost/app_dev.php/admin 时,它仍然强迫我使用 https 并让我出现 403 错误并禁止访问...即使我手动删除了“s”。我做了一个php bin/console cache:clear,重新启动了XAMPP,但仍然是同样的问题。但是对于像 Safari 这样的其他浏览器,http 运行良好。 URL 的指令实际上存储在 Chrome 浏览器缓存中,因为它具有 Symfony 定义的 TTL。所以只需删除浏览器缓存。

      【讨论】:

        【解决方案5】:

        对于 symfony 4.4: 我创建了一个文件 .env.local.php 并在我的本地机器上添加了:

        return array('APP_CHANNEL' => 'http');
        

        在我的生产服务器上,我有相同的文件,但使用的是“https”。当然这个 .env.local.php 文件会被 git 忽略。

        然后在我的 security.yml 文件中添加:

        access_control:
            - { path: ^/login$, roles: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: '%env(APP_CHANNEL)%' }
            - { path: ^/portal, roles: ROLE_USER, requires_channel: '%env(APP_CHANNEL)%' }
        

        我现在可以简单地控制我的开发/生产环境是否必须使用 https。重定向是在 .htaccess 文件中完成的,该文件也被 git 忽略,因此它不会被发送到我的生产服务器。 但我仍在学习,所以可能有更好的方法。干杯。

        【讨论】:

          猜你喜欢
          • 2019-03-12
          • 1970-01-01
          • 2019-07-31
          • 2020-02-22
          • 1970-01-01
          • 1970-01-01
          • 2015-01-21
          • 2018-04-08
          • 2015-08-10
          相关资源
          最近更新 更多