如何在 symfony 的 dev 和 prod 版本中禁用 HTTPS 或更改为 HTTP?

问题描述 投票:0回答:6

我的问题如标题所示。

在我的项目中,我尝试将 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
6个回答
1
投票

终于我找到了解决问题的方法。

由于我怀疑系统和浏览器缓存中有一些数据,尽管我正在清除 symfony 缓存,但在

https://
login
路线上仍然存在一些强制
admin


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

谢谢大家的宝贵时间。


1
投票

对于 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 忽略,因此它不会被发送到我的生产服务器。 但我仍在学习,所以可能有更好的方法。干杯。


0
投票

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

至于选择 https:// 或不选择,请尝试使用“%parameter%”,它在我的routing.yml 文件中当然有效 -

schemes:  ["%httpProtocol%"]
,在parameters.yml.dist 文件中设置 - 只需确保设置它在现场/制作中使用“https” `.


0
投票

扩展阿利斯特·布尔曼的答案。

而是使用“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/'

0
投票

我也遇到了同样的问题,首先将

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。所以只需删除浏览器缓存即可。


0
投票

可能已经晚了,但我希望这对某人有用。我刚刚在我的开发环境中遇到了同样的问题,并找到了一个解决方案,只能在本地开发环境中使用

只需使用

symfony serve --allow-http

执行您的 Symfony 应用程序
© www.soinside.com 2019 - 2024. All rights reserved.