Redirecciones https en Symfony

https-symfony.jpg
Solucionex
11
Oct 17

¿Has actualizado tu servidor y ahora tienes un certificado de seguridad ssl? Perfecto, ahora tu sitio ganará puntos frente a otros a la hora de posicionarse en google. Pero si estamos hablando de un software web de gestión, con quien ganarás puntos será con tus clientes, que ahora tendrán un entorno seguro en el que trabajar con sus datos. Aquí te vamos a explicar cómo hacer las redirecciones a https en tu aplicación web con Symfony.

Redireccionar a https con .htaccess

Antes de meternos dentro del propio framework de symfony y las opciones que nos da en su fichero de routing, te vamos a dar la opción bruta, la cómoda, ya que esta vale para cualquier tipo de entorno web, hacer una redirección por .htaccess.

Lo mejor de esta manera es que no se necesita ningún desarrollador symfony para hacer el cambio, ya que solo hay que tocar ese fichero y no hacen falta conocimientos técnicos más allá de saber qué es una redirección.

Si quisieras hacerlo por .htaccess, ya sabrás que tienes que poner estas líneas:

RewriteEngine On RewriteCond %{HTTPS} !=on
RewriteRule .*
https://%{SERVER_NAME}%{REQUEST_URI} [R,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ app.php [QSA,L]

Redirecciones https con Symfony

Aunque siempre vas a tener el método clásico que afecta prácticamente a cualquier sitio web, esté hecha con Symfony o con cualquier otro framework, de redireccionar vía .htaccess, te vamos a explicar un método más versátil utilizando las herramientas propias de este framework php, como es el routing, la hoja de parámetros y la configuración de seguridad.

El Routing de Symfony

En nuestro fichero de configuración de rutas app/config/routing.yml tendremos que añadir el parámetro schemes, al cual le asignaremos el protocolo https a cada una de las rutas que se importen, de esta manera nos quedará de esta forma:

#app/config/routing.yml
secure:
    path: /secure
    defaults: { _controller: AppBundle:Main:secure }
    schemes: [https]

Redireccionar a https o http dependiendo del entorno

A mí particularmente me gusta poner esta opción en función de un parámetro ¿Por qué? Por una razón tan sencilla como que nuestro software debería estar preparado para funcionar en distintos entornos Symfony y no solo en servidos configurados con un protocolo seguro ssl.

Así que en la hoja de parámetros de Symfony, app/config/parameters.yml, añado el parámetro httpProtocol y le asigno http o https dependiendo de si estoy desarrollando mi aplicación en local, en una máquina vagrant, en preproducción, producción...

Si lo hacemos de esta manera tendremos que hacer que el atributo schemes del routing tenga asignado el parámetro y no una cadena de texto.

# app/config/routing.yml
secure:
    path: /secure defaults:
    { _controller: AppBundle:Main:secure }
    schemes: [%httpProtocol%]

Reforzar la seguridad de Symfony

Con lo que hemos explicado previamente es suficiente para tener las redirecciones https en nuestra aplicación web, pero podemos conseguir que la herramienta que hemos desarrollado sea más fuerte si obligamos a que los usuarios solo se puedan loguear en un entorno seguro.

Para ello haremos el siguiente cambio en nuestro fichero app/config/security.yml, añadiendo a cada url de la que controlemos el acceso el parámetro requires_channel y obligándole a que acceda a través de https.

Al igual que el atributo schemes del routing se puede poner como cadena de texto, como parámetro para poder versionarlo y que tenga distintos valores en función del entorno.

access_control: - { path: ^/admin.*, roles: ROLE_ADMINISTRATOR, requires_channel: https}

Ficheros a cambiar en Symfony para forzar redirecciones https

Resumiendo, solo hay que hacer cambios en dos ficheros para poder usar https en toda nuestra aplicación Symfony, el app/config/parameters.yml, en el cual crearemos un nuevo parámetro en función del entorno donde esté la herramienta desarrollada.

Y el app/config/routing.yml, en el cual añadiremos a cada ruta importada el atributo schemes, y le asignaremos el parámetro definido en el fichero anterior.

Una vez hechos estos cambios tendrás una aplicación segura en Symfony en la que solo se podrá navegar vía https.