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:
-
YAML
YAML
-
XML
XML
-
PHP
PHP
1 2 3 4 5 6 7 8 9 |
# config/packages/security.yaml
security:
# ...
access_control:
- { path: '^/secure', roles: ROLE_ADMIN, requires_channel: https }
- { path: '^/login', roles: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: https }
# catch all other URLs
- { path: '^/', roles: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: https }
|
To make life easier while developing, you can also use an environment variable,
like requires_channel: '%env(SECURE_SCHEME)%'
. In your .env
file, set
SECURE_SCHEME
to http
by default, but override it to https
on production.
See How Does the Security access_control Work? for more details about access_control
in general.
Note
An alternative way to enforce HTTP or HTTPS is to use 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 How to Configure Symfony to Work behind a Load Balancer or a Reverse Proxy for more details.