How to Force HTTPS or HTTP for different URLs ============================================= .. tip:: The *best* policy is to force ``https`` on all URLs, which can be done via your web server configuration or ``access_control``. You can force areas of your site to use the HTTPS protocol in the security config. This is done through the ``access_control`` rules using the ``requires_channel`` option. To enforce HTTPS on all URLs, add the ``requires_channel`` config to every access control: .. configuration-block:: .. code-block:: yaml # config/packages/security.yaml security: # ... access_control: - { path: '^/secure', roles: ROLE_ADMIN, requires_channel: https } - { path: '^/login', roles: PUBLIC_ACCESS, requires_channel: https } # catch all other URLs - { path: '^/', roles: PUBLIC_ACCESS, requires_channel: https } .. code-block:: xml .. code-block:: php // config/packages/security.php use Symfony\Config\SecurityConfig; return static function (SecurityConfig $security): void { // .... $security->accessControl() ->path('^/secure') ->roles(['ROLE_ADMIN']) ->requiresChannel('https') ; $security->accessControl() ->path('^/login') ->roles(['PUBLIC_ACCESS']) ->requiresChannel('https') ; $security->accessControl() ->path('^/') ->roles(['PUBLIC_ACCESS']) ->requiresChannel('https') ; }; To make life easier while developing, you can also use an environment variable, like ``requires_channel: '%env(REQUIRED_SCHEME)%'``. In your ``.env`` file, set ``REQUIRED_SCHEME`` to ``http`` by default, but override it to ``https`` on production. See :doc:`/security/access_control` for more details about ``access_control`` in general. .. note:: An alternative way to enforce HTTP or HTTPS is to use :ref:`the scheme option ` of a route or group of routes. .. note:: Forcing HTTPS while using a reverse proxy or load balancer requires a proper configuration to avoid infinite redirect loops; see :doc:`/deployment/proxies` for more details.