Creative Commons License
This work is licensed under a
Creative Commons
Attribution-Share Alike 3.0
Unported License.

Master Symfony2 fundamentals

Be trained by SensioLabs experts (2 to 6 day sessions -- French or English).
trainings.sensiolabs.com

Discover the SensioLabs Support

Access to the SensioLabs Competency Center for an exclusive and tailor-made support on Symfony
sensiolabs.com

Comment forcer les routes à toujours utiliser HTTPS ou HTTP

Comment forcer les routes à toujours utiliser HTTPS ou HTTP

Quelquefois, vous voulez sécuriser certaines routes et être sûr qu'on y accède toujours via le protocole HTTPS. Le composant « Routing » vous permet de forcer le système de l'URI via la condition requise _scheme :

  • YAML
    1
    2
    3
    4
    5
    secure:
        pattern:  /secure
        defaults: { _controller: AcmeDemoBundle:Main:secure }
        requirements:
            _scheme:  https
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    <?xml version="1.0" encoding="UTF-8" ?>
    
    <routes xmlns="http://symfony.com/schema/routing"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://symfony.com/schema/routing http://symfony.com/schema/routing/routing-1.0.xsd">
    
        <route id="secure" pattern="/secure">
            <default key="_controller">AcmeDemoBundle:Main:secure</default>
            <requirement key="_scheme">https</requirement>
        </route>
    </routes>
    
  • PHP
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    use Symfony\Component\Routing\RouteCollection;
    use Symfony\Component\Routing\Route;
    
    $collection = new RouteCollection();
    $collection->add('secure', new Route('/secure', array(
        '_controller' => 'AcmeDemoBundle:Main:secure',
    ), array(
        '_scheme' => 'https',
    )));
    
    return $collection;
    

La configuration ci-dessus force la route nommée secure à toujours utiliser HTTPS.

Pendant la génération de l'URL de secure, et si le système actuel est HTTP, Symfony va automatiquement générer une URL absolue avec HTTPS comme « scheme » :

1
2
3
4
5
6
7
{# Si le « scheme » actuel est HTTPS #}
{{ path('secure') }}
{# génère /secure

{# Si le « scheme » actuel est HTTP #}
{{ path('secure') }}
{# génère https://example.com/secure #}

La condition requise est aussi forcée pour les requêtes entrantes. Si vous essayez d'accéder au chemin /secure avec HTTP, vous serez automatiquement redirigé à la même URL, mais avec le « scheme » HTTPS.

Les exemples ci-dessus utilisent https en tant que _scheme, mais vous pouvez aussi forcer une URL à toujours utiliser http.

Note

Le composant Security fournit une autre façon d'imposer HTTP ou HTTPS via le paramètre requires_channel. Cette méthode alternative est mieux adaptée pour sécuriser une « zone » de votre site web (toutes les URLs dans la zone /admin) ou pour sécuriser les URLs définies dans un bundle tiers.