Continuando con nuestra revisión de los archivos htaccess, hoy examinaremos cómo usar mod_rewrite para crear URL bonitas.
Si bien algunos afirman que las URL bonitas ayudan en los rankings de los motores de búsqueda, el debate aquí es feroz, todos estamos de acuerdo en que las URL bonitas facilitan las cosas para nuestros usuarios y agrega un nivel de profesionalismo y refinamiento a cualquier aplicación web. Podría explicar todas las razones teóricas de esto, pero me gustan más los ejemplos del mundo real. Nos gusta o lo odiamos, todos debemos admitir que Twitter es una aplicación web muy popular y parte de la razón de esto es, sin duda, la forma en que formatea las URL. Puedo decirle a cualquier persona que sepa que mi nombre de usuario de Twitter es noahhendrix, y saben que mi perfil se puede encontrar fácilmente en twitter.com/noahhendrix. Este concepto aparentemente simple tiene vastos efectos en la popularidad de su aplicación..
Solo para poner las cosas en perspectiva podemos ver otro sitio web popular de redes sociales, Facebook. Desde el lanzamiento del sitio en 2004, el sistema de perfiles ha crecido y evolucionado para adaptarse mejor a los usuarios, pero un agujero evidente fue la URL de un perfil. Desde el momento en que me registré en Facebook, mi perfil estaba en la URL http://www.facebook.com/profile.php?id=1304880680. Esa es toda una boca llena, y recientemente parece que Facebook se ha dado cuenta de eso y lanzaron las URL de vanidad de Facebook. Ahora puedo compartir mi perfil de Facebook diciéndoles a las personas que mi nombre de usuario de Facebook es "noahhendrix", que ellos saben que se puede encontrar en facebook.com/noahhendrix. Si bien es probable que no tengamos una aplicación tan popular como Facebook, todavía podemos tomar prestadas algunas páginas de su libro..
Una descripción general rápida antes de sumergirnos en el código, en el tutorial de hoy analizaremos dos métodos ligeramente diferentes para crear URL bonitas utilizando HTACCESS. La diferencia entre los métodos es si Apache o PHP están haciendo el trabajo pesado para separar la URL para analizarla. Quiero señalar que los tutoriales de mod_rewrite son casi tan antiguos como el Internet en sí, y este no es el primero. Al final, usaré uno de los métodos para crear una aplicación simple que muestre cómo se verían estas soluciones en un sitio web real (y no 100% de calidad de producción). El servicio que crearemos es un acortador de URL que puede reflejar la funcionalidad de sitios como bit.ly, TinyURL o su.pr. Así que sin más pelusa veamos el código..
Primero, podemos colocar todo nuestro código en los archivos .htaccess de Apache. Esto podría verse algo como esto:
Opciones + SeguirSymLinks RewriteEngine On RewriteCond% SCRIPT_FILENAME! -D RewriteCond% SCRIPT_FILENAME! -F RewriteRule ^ users / (\ d +) * $ ./profile.php?id=$1 RewriteRule ^ threads / (\ d +) + ./thread.php?id=$1 RewriteRule ^ search /(.*)$ ./search.php?query=$1
Comencemos por la parte superior y continuemos hacia abajo para comprender mejor lo que está sucediendo aquí. La primera línea configura el entorno para seguir los enlaces simbólicos utilizando la directiva de Opciones. Esto puede o no ser necesario, pero algunos hosts web usan enlaces simbólicos (similar al alias en MacOSX o los accesos directos es Windows) para errores comunes de solicitud HTTP y estos suelen ser archivos con enlaces simbólicos, o al menos así es como entiendo el razonamiento. A continuación le decimos a Apache que vamos a utilizar el motor de reescritura. Las siguientes dos líneas son muy, muy importantes, restringe la reescritura de las URL solo a las rutas que en realidad no existen. Esto evita que las reglas de abajo coincidan example.com/images/logo.png por ejemplo. El primero evita directorios existentes con el !-re bandera y la segunda con !-F significa ignorar los archivos existentes.
Las siguientes tres líneas son los comandos reales de reescritura de URL. Cada línea crea una regla que intenta hacer coincidir un patrón de expresiones regulares con la URL entrante. Las expresiones regulares, al menos para mí, son un conjunto de reglas difíciles de recordar, pero siempre me resulta útil usar este tutorial de Nettut's Jeffery Way y la herramienta que recomienda. Me resultó fácil escribir las URL de muestra que queremos hacer coincidir y luego intentar unir el patrón.
El primer argumento es el patrón, entre el signo de caret y el signo de dólar. Le decimos a Apache que queremos que las URL soliciten el directorio de usuarios (un directorio artificial, no tiene que existir realmente) seguido de / y cualquier número de números. Los paréntesis crean un grupo de captura, puede usar tantos como desee, sirven como variables que luego podemos trasplantar en nuestra reescritura. El asterisco significa que el usuario puede ingresar lo que quiera, y no afectará la reescritura, esto es principalmente para manejar una barra inclinada de manera que example.com/users/123 es lo mismo que example.com/users/123/ como los usuarios esperan.
El segundo argumento es el camino que queremos llamar, este a diferencia del primero debe ser un archivo real. Le decimos a Apache que busque en el directorio actual un archivo llamado perfil.php y enviar el parámetro id = $ 1 junto con eso. ¿Recuerdas el grupo de captura antes? Ahí es donde obtenemos la variable $ 1, los grupos de captura comienzan en uno. Esto crea una URL en el servidor como example.com/profile.php?id=123.
Este método es excelente para las aplicaciones web heredadas que tienen estructuras de URL existentes que nos impiden reescribir fácilmente el backend para comprender un nuevo esquema de URL porque para el servidor la URL es la misma, pero para el usuario es mucho más agradable.
El siguiente método es ideal para aquellos que no desean distribuir demasiada lógica a Apache y se sienten más cómodos en PHP (o lenguajes de script similares). El concepto aquí es capturar cualquier URL que reciba el servidor y enviarla a una página de controlador de PHP. Esto viene con el beneficio adicional de control, pero una mayor complejidad al mismo tiempo. Su archivo HTACCESS podría verse así:
Opciones + FollowSymLinks RewriteEngine On RewriteCond% SCRIPT_FILENAME! -D RewriteCond% SCRIPT_FILENAME! -F RewriteRule ^. * $ ./Index.php
Todo es igual que el anterior, excepto la última línea, así que lo omitiremos. En lugar de crear un grupo de captura, solo le pedimos a Apache que capture cada URL y la redirija a index.php. Lo que esto significa es que podemos hacer todo nuestro manejo de URL en PHP sin confiar demasiado en las rutas de URL estrictas en HTACCESS. Esto es lo que podríamos hacer en la parte superior de nuestro archivo index.php para analizar la URL:
La primera línea no es necesaria a menos que su aplicación no viva en el directorio raíz, como mis demostraciones. Estoy eliminando la parte sin sentido de la URL de la que no quiero que PHP se preocupe. $ _SERVER ['REQUEST_URI'] es una variable de servidor global que PHP proporciona y almacena la URL de solicitud, generalmente se ve así:
/ envato / pretty / php / users / query
Como puedes ver, es básicamente todo después del nombre de dominio. A continuación, dividimos la parte restante de la ruta virtual y la dividimos por la / Carácter que nos permite agarrar variables individuales. En mi ejemplo acabo de imprimir el $ params Por supuesto, querrás hacer algo un poco más útil..
Una cosa que podrías hacer es tomar el primer elemento de la $ params matriz e incluya un archivo con el mismo nombre y dentro del archivo, puede utilizar el segundo elemento de la matriz para ejecutar algún código. Esto podría parecer algo como esto:
ADVERTENCIA: ¡La primera parte de este código es increíblemente importante! Debe restringir absolutamente qué páginas puede obtener un usuario para que no tengan la oportunidad de imprimir ninguna página que deseen adivinando los nombres de los archivos, como un archivo de configuración de base de datos..
Ahora que tenemos la caja de jabón fuera del camino, sigamos adelante. A continuación comprobamos si el archivo solicitado está en el $ safe_pages array, y si es que incluimos de otro modo incluiremos una página 404 no encontrada. En la página incluida verá que tiene acceso a la $ params matriz y puede tomar cualquier dato que sea necesario en su aplicación.
Esto es genial para aquellos que quieren un poco más de control y flexibilidad. Obviamente, requiere un poco de código adicional, por lo que probablemente sea mejor para los nuevos proyectos que no requieren una gran cantidad de código para actualizarse para adaptarse a los nuevos formatos de URL.
Esta última parte del tutorial nos permitirá poner un poco de uso al código que vimos anteriormente, y es más o menos un ejemplo de la "vida real". Vamos a crear un servicio llamado. shrtr, Formé este nombre para que cualquier otro producto con este nombre no esté asociado con el código que estoy publicando a continuación.. Nota: Sé que esto no es un concepto original, y que solo está destinado a la demostración de mod_rewrite. Primero echemos un vistazo a la base de datos:
Como puede ver, esto es muy sencillo, solo tenemos 4 columnas:
A continuación, repasemos los seis archivos que necesitamos crear para esta aplicación:
Eso es todo lo que necesitamos para nuestro ejemplo básico. No cubriré index.php o css / style.css con gran detalle porque no tienen PHP y son archivos estáticos.
# index.php ----Hace URLs Shrtr encogerser.yo
Lo único realmente interesante que se debe tener en cuenta es que enviamos el formulario con un campo llamado URL a crear.php.
# css / style.css ---- / * reset * / * font-family: Helvetica, sans-serif; margen: 0; relleno: 0; / * site * / html, body background-color: # 008AB8; a color: darkblue; decoración de texto: ninguna; #pagewrap margen: 0 auto; ancho: 405px; h1 color: blanco; margen: 0; text-align: center; tamaño de fuente: 100px; h1 .r color: darkblue; .body -moz-border-radius: 10px; -webkit-border-radius: 10px; color de fondo: blanco; text-align: center; relleno: 50px; altura: 80px; posición: relativa; .body .instructions display: block; margen inferior: 10px; .body .back derecha: 15px; superior: 10px; posición: absoluta; entrada de cuerpo [tipo = texto] pantalla: bloque; tamaño de fuente: 20px; margen inferior: 5px; text-align: center; relleno: 5px; altura: 20px; ancho: 300px;
Todo eso es muy genérico, pero hace que nuestra aplicación sea un poco más presentable..
El último archivo básico que necesitamos ver es nuestro db_config.php, Creé esto para abstraer algo de la información de conexión de la base de datos.
# db_config.php ----
Debe reemplazar los valores con lo que funciona en su base de datos, y el host probablemente sea localhost, pero necesita verificar con su proveedor de alojamiento para asegurarse. Aquí está el volcado de SQL de la tabla., url_redirects que contiene toda la información que mostramos arriba:
-- -- Estructura de la tabla para la tabla 'url_redirects' - CREAR TABLA SI NO EXISTE 'url_redirects' ('id' int (11) NOT NULL auto_increment, 'short' varchar (10) NOT NULL, 'url' varchar (255) NOT NULL, ' created_at 'timestamp NOT NULL predeterminado CURRENT_TIMESTAMP, PRIMARY KEY (' id '), KEY' short '(' short ')) ENGINE = MyISAM DEFAULT CHARSET = utf8;
A continuación, veamos el código necesario para crear nuestra URL corta..
# create.php ---- shrtr.me/".$short; else $ html = "Error: no puedo encontrar la base de datos"; mysql_close ($ db);?>Hace URLs Shrtr encogerser.yo
= $html ?>
X
Ahora nos estamos volviendo un poco más complejos! Primero debemos incluir las variables de conexión a la base de datos que creamos anteriormente, luego almacenamos el parámetro de URL que nos envió el formulario de creación en una variable llamada $ url. A continuación, hacemos algunas expresiones regulares de magia para comprobar si realmente enviaron una URL, si no almacenamos un error. Si el usuario ingresó una URL válida, creamos una conexión a la base de datos utilizando las variables de conexión que incluimos en la parte superior de la página. A continuación, generamos una cadena de 5 caracteres aleatorios para guardar en la base de datos, utilizando la función substr. La cadena que dividimos es el hash md5 de la hora actual () y $ url concatenados juntos. Luego insertamos ese valor en el url_redirects tabla junto con la URL real, y almacenar una cadena para presentar al usuario. Si no se pueden insertar los datos almacenamos un error. Si pasa a la parte HTML de la página, todo lo que hacemos es imprimir el valor de $ html, sea error o éxito Obviamente, esta no es la solución más elegante pero funciona!
Así que tenemos la URL en la base de datos vamos a trabajar en serve.php por lo que en realidad podemos traducir el código corto en una redirección.
Hace URLs Shrtr encogerser.yo
= $html ?>
X
Este es muy similar a crear.php Incluimos la información de la base de datos y almacenamos el código corto que se nos envía en una variable llamada $ corto. A continuación, consultamos la base de datos para la URL de ese código corto. Si obtenemos un resultado, redirigimos a la URL, si no imprimimos un error como antes.
En lo que respecta a PHP, eso es todo lo que tenemos que hacer, pero en este momento para compartir una URL corta, los usuarios deben ingresar esta, http://shrtr.me/server.php?short=SHORT_CODE no es muy bonita ¿verdad? Veamos si podemos incorporar algún código mod_rewrite para hacer esto más agradable..
De los dos métodos sobre los que escribí al principio del tutorial, usaremos Apache one porque esta aplicación ya está creada sin considerar ningún análisis de URL. El código se verá algo como esto:
Opciones + FollowSymLinks RewriteEngine On RewriteCond% SCRIPT_FILENAME! -D RewriteCond% SCRIPT_FILENAME! -F RewriteRule ^ (\ w +) $ ./serve.php?short=$1
Al pasar por RewriteRule, estamos dirigiendo cualquier tráfico que aún no tenga un archivo o directorio real para serve.php y poniendo la extensión en la variable GET corta. No está mal, no te lo intentes.!
Hoy aprendimos algunas maneras diferentes de utilizar mod_rewrite en nuestra aplicación para hacer que nuestras URL sean bonitas. Como siempre, estaré vigilando los comentarios si alguien tiene problemas, o puede contactarme en twitter. Gracias por leer!