Herramientas de usuario

Herramientas del sitio


cursos:yii2:cleanurl

URL's limpias

Podemos hacer que las rutas de acceso a nuestra aplicación sean “friendly”, cambiando la estructura SERVIDOR/index.php?r=controlador/accion&param=valor… por una más limpia, de la forma SERVIDOR/controlador/accion/…, que es más clara de ver.

Para ello, haremos lo siguiente:

Activar el módulo rewrite de Apache

EN XAmpp de windows suele estar activado, pero en Linux no. Para activarlo en Linux, hay que ver la documentación de Apache según el sistema que manejemos, pero suele hacerse mediante el comando a2enmod rewrite .

Una vez activado, en la carpeta web de nuestra aplicación tenemos que crear el fichero .htaccess, con el contenido siguiente:

RewriteEngine on
# Si un directorio o fichero existe, se utiliza directamente
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# Sino, se envía a index.php
RewriteRule . index.php

También es necesario que la ruta de nuestra aplicación tenga permitido hacer cambios de configuración de Apache. Para ello, en httpd.conf debemos activar AllowOverride en el directorio raiz:

<Directory /var/www/ >
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
</Directory>

Cambio de URLManager en Yii2

Ahora tenemos que configurar Yii2 para que las rutas se generen de la forma explicada arriba. Para ello, en config/web.php, incluimos en components:

'components'=>[
   ...
   'urlManager' => [
        'class' => 'yii\web\UrlManager',
        // Deshabilita index.php
        'showScriptName' => false,
        // Deshabilita las rutas r=controlador/acción
        'enablePrettyUrl' => true,
        'rules' => array(
                '<controller:\w+>/<id:\d+>' => '<controller>/view',
                '<controller:\w+>/<action:\w+>/<id:\d+>' => '<controller>/<action>',
                '<controller:\w+>/<action:\w+>' => '<controller>/<action>',
        ),
        ],
  ]      

Para utilizar este sistema, evidentemente, no podemos utilizar un una vista código HTML con enlaces mediante ?r. Utilizaremos el HTML::a() para los links y botones, y la nomenclatura [controlador,param⇒valor,param⇒valor…] para cualquier acción de la aplicación:

  echo Html::a('Modificar',['usuarios/update','id'=>$model->id]);
  //El enlace será "/index.php?r=usuarios/update&id=23"  
  // o "/usuarios/update/23"  dependiendo de si activamos o no las friendly URL