¿Tienes algún sitio web hecho sin ningún framework y quieres optimizar las URLs sin rehacer todo el sitio desde cero? Este tutorial puede ayudarte.
Cuando usamos un framework obtenemos muchas herramientas de desarrollo que hacen nuestro sitio web más usable y poderoso, una de ellas es la posibilidad de manipular las URLs para SEO, es decir:
- De esto: noticias.php?id=52
- pasamos a algo como esto: noticias/52/titulo-relevante-para-seo
Lo cual permite que el usuario sepa de qué se trata la noticia aún antes de abrir la URL y nos ayuda a obtener más visitas de Google. Pero si no usaste ningún framework, aún así puedes aprovecharte de las ventajas de los nuevos componentes de Symfony2.
La nueva versión de Symfony sigue siendo un poderoso framework listo para usar, sin embargo, sus componentes también pueden ser usados independientemente del framework, y esto es lo que haremos acá.
Usaremos el componente de Routing por sí solo. Para descargarlo vamos a usar Composer como nos recomienda la misma gente de Symfony.
Tip :
Creamos un archivo composer.json en un directorio de nuestro proyecto:
Código :
{ "name": "framework", "version": "1.0.0", "require": { "symfony/routing": "2.1.*" } }
Luego descargamos la biblioteca de composer usando la consola:
Código :
curl -s http://getcomposer.org/installer | php
O también podemos descargar el archivo de acá.
Una vez hecho esto tipeamos esto en la consola para instalar nuestras dependencias:
Código :
php composer.phar install
Ya con esto podremos ver cómo se ha creado un directorio "vendor" con el componente de Symfony que necesitamos.
Una vez hecho esto vamos a crear un archivo .htaccess para usar Mod Rewrite de Apache (es bastante común este módulo, de todas formas asegurense de que esté instalado en su servidor).
Código :
<IfModule mod_rewrite.c> RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ routing.php?url=/$1 [QSA,L] </IfModule>
Básicamente todo lo que no sean archivos válidos será reenviado a nuestro routing.php que se encargará del resto. Fíjense que junto con él se envía una variable GET "url".
Acá tenemos routing.php:
Código :
<?php // Las clases de Symfony que vamos a usar: use Symfony\Component\Routing\Matcher\UrlMatcher; use Symfony\Component\Routing\RequestContext; use Symfony\Component\Routing\RouteCollection; use Symfony\Component\Routing\Route; /** * Edita esta variable para colocar la ruta y la extension de tus controladores * "%s" sera reemplazado por el parametro _file de las rutas * Ejemplo: * $filePattern = ./misarchivos/%s.php5 * _file = 'mipagina' * Resultado: ./misarchivos/mipagina.php5 */ $filePattern = './controllers/%s.php'; $parameters = array (); try { // Cargamos el autoloader que viene con Composer require_once __DIR__.'/vendor/.composer/autoload.php'; //Creamos nuestra coleccion de rutas $routes = new RouteCollection(); /** * Configuramos todas nuestras rutas: * El primer parametro es el ID de la ruta * El segundo es una clase Ruta donde configuraremos nuestra expresion regular * En el caso del ej: '/portafolio/{id}' * {id} se convertira en una variable GET al final del ejemplo * Y el tercer parametro corresponde a un array donde asignaremos parametros adicionales * En este caso es muy importante que cada ruta tenga su parametro _file * Que sera quien indicara al script que archivo cargar * Mas documentacion: http://symfony.com/doc/current/components/routing.html */ $routes->add('portafolio', new Route('/portafolio/{id}', array('_file' => 'portafolio'))); // Symfony stuff: $context = new RequestContext($_SERVER['REQUEST_URI']); $matcher = new UrlMatcher($routes, $context); // GET[url] es enviado por el htaccess // Esta linea es la que se encarga de comparar las rutas y devolvernos los parametros necesarios $parameters = $matcher->match($_GET['url']); } catch (Symfony\Component\Routing\Exception\ResourceNotFoundException $exc) { // En caso de no encontrar la ruta,se cargara un archivo 404 $parameters['_file'] = '404'; } catch (Exception $exc) { // En caso de ocurrir otro error cargaremos un archivo 501 $parameters['_file'] = '501'; } // Mezclamos los parametros de la ruta con parametros get // Dado que cuando no se usan estos sistemas de rutas generalmente se trabaja con GET $_GET = array_merge($_GET, $parameters); // Armamos la ruta a nuestro archivo $file = sprintf($filePattern, $parameters['_file']); if ( ! file_exists($file)) { exit ('No existe el archivo: ' . $file); } // y finalmente cargamos el archivo include_once $file;
Los "controladores" como quise llamarlos se guardan en una carpeta controllers/ (pueden dejarlos en la misma carpeta pública, de manera que las antiguas URLs sigan funcionando, lo ideal sería luego crear redirects 301 a las nuevas rutas.
Tu archivo portafolio.php así como los demás archivos que ya tenías deberían seguir funcionando de la misma manera.
Para probar yo sólo hice algo así en controllers/portafolio.php:
Código :
<?php echo $_GET['id'];
Recuerden agregar archivos para los errores 404 y 501.
Por último, todo esto habría quedado mejor en una clase más que en programación estructurada. Symfony tiene clases que se encargan de manejar las rutas de manera poderosa con caché, YAML para la configuración y demás. Yo sólo quise proporcionar una manera rápida de acomodar las URLs de sus sitios antes que se decidan o tengan tiempo de reprogramarlos en un nuevo framework o lenguaje.
¡Saludos a todos!
¿Sabes SQL? ¿No-SQL? Aprende MySQL, PostgreSQL, MongoDB, Redis y más con el Curso Profesional de Bases de Datos que empieza el martes, en vivo.
Por gosunkugi el 12 de Marzo de 2012
que gracias
Por ggdf el 12 de Marzo de 2012
Por saul el 13 de Marzo de 2012
Por jose el 13 de Marzo de 2012
Por Duilio el 13 de Marzo de 2012
Si buscas un poco en google hay algunas soluciones: https://www.google.com/search?client=ubuntu&channel=fs&q=urls+amigables+sin+htaccess&ie=utf-8&oe=utf-8
Pero que yo sepa lo mejor con apache es usar el mod rewrite y sus htaccess, habla con tus proveedores de hosting y si no te pueden ayudar hay muchísimos otros hostings compartidos y económicos que soportan eso, como dreamhost o hostgator.
Por esutoraiki el 13 de Marzo de 2012
Por Maikel el 13 de Marzo de 2012
PD: si saben de tutoriales de symfony antiguos que estén aquí avisenme por MP o cualquier medio y yo les pongo el tag.
Por Duilio el 13 de Marzo de 2012
De todas formas es muy válida tu acotación, yo trataría de investigar el método que hace el dump para htaccess a ver si puede aprovecharse para proyectos que no usen el framework Symfony (por defecto te da las rutas y las variables que Symfony utilizaría).
Por Duilio el 13 de Marzo de 2012
Por Maikel el 13 de Marzo de 2012
Duilio :
Una de introducción a symfony 2 no estaría nada mal
Saludos
Por Mariux el 13 de Marzo de 2012
Duilio :
wow, y casi sin ningún error de ortografía! *le da muchas medallitas
Por Duilio el 13 de Marzo de 2012
Por Duilio el 13 de Marzo de 2012
Por Duilio el 15 de Marzo de 2012
Por otro lado, esta función ayuda a hacer las URLs más amigables aún:
Código :
Pásenle el título de sus posts, noticias, productos, proyectos, eventos, etc. y obtendrán una cadena que podrán usar para sus URLs por ej.: "Mi Primer Proyecto" quedaría así: mi-primer-proyecto.
Y la URL de su proyecto podría ser: portafolio/1/mi-primer-proyecto.
Espero les sirva.
Saludos.
Por pablodelrio el 12 de Diciembre de 2012
Si tienes un sitio algo asi:
http://www.librosjulanito.com/verlibro.php?id=7
Y quieres hacer algo como esto:
http://www.librosjulanito.com/libro/titulo
Hacer lo siguiente:
RewriteEngine On
RewriteRule ^libro/([0-9]+)/?$ verlibro.php?id=$1 [NC,L]
Y listo.
No se compliquen tanto la existencia.
Saludos
PD: Si estoy errado en algún punto, favor avisarme.
Por Cristian Angulo Nova el 28 de Septiembre de 2014
Sólo va require_once __DIR__.'/vendor/autoload.php';
Esta línea carga el autoload_real que viene con el composer