¿Qué es el archivo .htaccess y cómo se beneficia nuestro proyecto?
El archivo .htaccess es una herramienta poderosa para limpiar y optimizar las URLs de nuestro proyecto web. Permite transformar direcciones complicadas y poco intuitivas en URLs más limpias y amigables, esenciales para mejorar el SEO (Search Engine Optimization). Imagina pasar de una URL como domain.com/?page=contact a una más sencilla como domain.com/contact. Eso es exactamente lo que hace el archivo .htaccess, facilitando tanto la comprensión para los usuarios como la indexación por motores de búsqueda.
¿Cómo utilizar .htaccess con un virtual host?
Para lograr URLs limpias con .htaccess, es recomendable usar un virtual host. Esto se debe a que el archivo .htaccess debe estar directamente en el directorio raíz del dominio. A continuación, te muestro cómo configurarlo:
Crear un virtual host: Esto es fundamental, y el curso anterior ya te enseñó cómo hacerlo para diferentes sistemas operativos.
Configurar el archivo de hosts: Debes redirigir tu dominio virtual hacia localhost o 127.0.0.1.
Usar .htaccess en el dominio: Coloca el archivo .htaccess directamente en el dominio para una mejor gestión de las URLs.
¿Qué consideraciones debo tener al modificar .htaccess?
Modificar .htaccess requiere algunas configuraciones previas para su correcto funcionamiento:
Habilitar el módulo de reescritura: Es necesario descomentar la línea de LoadModule rewrite_module en el archivo de configuración del servidor web comúnmente llamado httpd.conf.
Reiniciar el servidor: Tras realizar cambios en el archivo de configuración, asegúrate de reiniciar el servidor para aplicar los cambios.
Verificar la compatibilidad del sistema operativo: Las instrucciones para habilitar el módulo pueden diferir si usas macOS, Linux o Windows, particularmente si usas sistemas M1 o Intel en macOS. Recuerda que en XAMPP suele venir habilitado por defecto.
¿Cómo funcionan las reglas de reescritura con .htaccess?
Las reglas de reescritura en .htaccess funcionan con expresiones regulares. Por ejemplo, la regla:
RewriteRule ^(.*)$ index.php?page=$1 [L]
^(.*)$: Captura cualquier cosa que escribas después del dominio y la almacena como una variable.
index.php?page=$1: Redirige a index.php pasando lo capturado como parámetro page.
L: Indica que es la última regla a considerar para la reescritura de URL.
Con esto, cuando accedas a domain.com/contact, el servidor buscará index.php?page=contact, permitiendo que tu Front Controller maneje la petición.
Es crucial para los desarrolladores web entender y utilizar .htaccess, especialmente al trabajar con proyectos que requieren URLs amigables y optimizadas para SEO. Aunque el uso de .htaccess pueda parecer complicado al principio debido a su lenguaje basado en expresiones regulares, el dominio de esta herramienta puede ser un gran activo en la creación de sitios eficientes y accesibles. Seguir practicando y buscando información adicional te ayudará a perfeccionar su uso y superar cualquier reto que surja en el camino. ¡Continúa aprendiendo y experimentando en tus proyectos!
Y tus APACHE_MODULES en /etc/sysconfig/apache2 para habilitar el mod_rewrite
APACHE_MODULES="actions alias auth_basic authn_core authn_file authz_host authz_groupfile authz_core authz_user autoindex cgi dir env expires include log_config mime negotiation setenvif ssl socache_shmcb userdir reqtimeout php7 rewrite"
Excelente explicacion !! ✨
.
Desmenuzando linea por linea se entiende cual era la magia que estaba haciendo este archivo.
.
Esta era la clase que faltaba !! Este archivo siempre habia sido un dolor de cabeza en mis proyectos 😵
El archivo .htaccess
Ubuntu 22.04, php 8.2, apache 2.4
Lo primero es decirle a Apache que necesitamos activar el mod_rewrite. Está instalado por defecto pero deshabilitado por defecto. Se debe usar a2enmodpara habilitarlo:
sudo a2enmod rewrite
Eso activará el modulo o alertara de que el modulo esta activo. Para hacer efectivos los cambios se debe reiniciar Apache.
sudo systemctl restart apache2
Info extraida de internet
Para uno de los multiples dominios alojados en un servidor Debian 9, necesité configurar el archivo .htaccess. Esta opción no viene habilitada por defecto, y me costo mucho dar con la solución. Después de muchos intentos, pruebas y errores, a continuación detallo el procedimiento que me parecio el más correcto (este procedimiento al parecer es especifico para Debian 9, puede variar el nombre y la ubicación del archivo en otras versiones de Linux)
Editar el archivo apache2.conf
sudonano /etc/apache2/apache2.conf
en la sección de “default security model” encuentran la siguiente configuración:
<Directory /var/www/> Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
Salimos con control + x, grabamos con Y y apretamos [enter]. Finalmente para que los cambios tengan efecto, reiniciamos el servicio de apache2.
$ sudoservice apache2 restart
Verificamos que el servicio se este ejecutandose correctamente:
$ sudoservice apache2 status
Listo! Los archivos .htaccess funcionan para todos los dominios. Si quieren que algunos dominios, no tengan la funcionalidad de utilizar sus respectivos .htaccess, la configuración se debe hacer por cada directorio de dominio.
Gracias Maquina!!
Seria bueno que haya un curso de Apache y Nginx en platzi pls
Que es [L]??
Es un flag que se puede usar al final del RewriteRule. La estructura general de una regla es:
RewriteRule pattern target [Flag1,Flag2,Flag3]
En particular [L] viene de last, y quiere decir que si esa regla hace match no siga procesando otras reglas.
Se utiliza para reescribir mediante condiciones la url de nuestro sitio web, esto nos permite utilizar la definición de Front Controller pero a su vez teniendo URL’s más limpias, fáciles de leer y buenas para SEO.
El proceso que sigue el rescribir la url es:
Tomar la url ingresada por el usuario
La url pasa por el archivo htacess y se somete a las reglas y condiciones registradas en el mismo
El resultado es enviado al Front Controller para que pueda mostrar al usuario el contenido que solicita
RewriteEngine On //Habilitamos la sobre-escrituraRewriteCond %{REQUEST_FILENAME}!-f //Condición para el caso de que no se encuentre el archivoRewriteCond %{REQUEST_FILENAME}!-d //Condición para el caso de que no se encuentre el directorioRewriteRule ^(.*)$ index.php?page=$1[L]/**
Donde: ^(.*)$ es una expresión regular, ^ indica el inicio de la expresión y $ el final
.*: es la expresión que indica que cualquier caracter puede ser escrito en la url y se puede repetir cualquier cantidad de veces, es decir, que aplicará para cualquier cosa que se escriba en la url
(): Los parentesis indican que todo lo que se escriba en la url se guarda en una variable que se utilizara luego en la sentencia de la condición, esto se almacena en $1
index.php?page=$1 : Es la condición de redirección, a donde enviamos al usuario según como lo definamos en le programa. El valor $1 representa la variable donde se almaceno el contenido de la expresión regular que se colocó dentro de los parentesis.
El page en la condición corresponde a la variable que vamos a pasar al parámetro $_GET
*/
Creo que es la clase que muchos nos hacia falta
como podríamos hacer esto mismo con nginx
NGINX usa nginx.confen lugar de .htaccesspero hay un recurso online que he usado bastante que funciona https://winginx.com/en/htaccess.
Aunque no soporte de forma nativa .htaccess recuerdo que en alguna epoca de mi vida hice que lo trabajara NGINX pero no recuerdo como o si solo me lo sonñé.
A qué curso refiere el "virtualHost? Me gustaría hacer ese curso ...
No es un curso, es una forma de configurar tu servidor Apache para que muestre carpetas locales como dominios en tu navegador.
Disculpa, me expresé mal. El prof. habla del curso de "Virtual Host" por eso pregunté. El profesor no especifica o pone el enlace para saber que curso.
No me funciona cuando escribo /services despues de la url me sale Not Found
Posiblemente no esté habilitado la sabreescritura en la configuración de apache
aqui mi index.
$page = $_GET['page']??'home'; $files =glob(__DIR__."/pages/*.php");// Reads all files and folders $exist_files =[];foreach($files as$key=> $value){ $temp =explode('/',$value);array_push($exist_files,$temp[count($temp)-1]);}if(in_array("$page.php",$exist_files)){require(__DIR__."/pages/{$page}.php");}else{require(__DIR__."/404.php");}
Ya regreso voy a Virtual Host
si a alguien no le carga la url MIchilango,test en el navegador. puede intentar cerrar el folder en visual estudio code. Al reabrir el visual studio code reabra la carpeta htaccess. Eso me soluciono el problema