⚙️ Generador .htaccess
Activa o desactiva opciones para generar un .htaccess Apache listo para producción: redirección HTTPS, HSTS, gzip / brotli, caché, bloqueo de archivos sensibles y WordPress.
🔒 Sobre la privacidad
- ・Toda la generación ocurre en tu navegador
- ・Los dominios y ajustes nunca se envían al servidor
- ・Sin registros, sin seguimiento, sin base de datos
🧩 Selecciona funciones
📄 .htaccess generado
📖 Dónde se suele tropezar
Genera un .htaccess que combina redireccion a HTTPS, canonicalizacion de www, seleccion de version de PHP, control de cache, cabeceras de seguridad y restricciones de acceso. Todo se ejecuta en el navegador. Un .htaccess tiene una propiedad peligrosa que ningun otro archivo de configuracion comparte: una linea equivocada y todo lo que cuelga de ese directorio devuelve 500 al instante. Y la pagina de error no te dice la causa. Si tu panel de administracion vive en el mismo arbol, no podras arreglarlo desde alli: antes de editar, asegurate de tener una via de vuelta.
| Caso | Qué ocurre | Qué hacer |
|---|---|---|
| Una linea erronea convierte todo el sitio en un 500 | Un .htaccess se relee en cada peticion, de modo que un error afecta a todas las peticiones desde el instante en que guardas. La causa mas frecuente es una directiva de un modulo que no esta cargado: escribe Header set ... donde mod_headers esta desactivado y Apache no puede interpretar la linea, asi que devuelve 500 Internal Server Error. Lo incomodo es que no se trata de "la sintaxis esta bien pero no funciona", sino de "la configuracion es ilegible y por tanto todo se detiene". Lo unico que ves es una pagina de error generica, y no indica que linea ni que hay mal en ella: esa informacion solo existe en el registro de errores del servidor. En un alojamiento compartido donde no puedes ver el registro, aislar la causa se convierte en prueba y error. |
Envuelve siempre las directivas dependientes de modulo en <IfModule>. Metelas dentro de <IfModule mod_headers.c> y un entorno sin el modulo simplemente las ignora en lugar de devolver 500: solo con eso se evitan la mayoria de los incidentes. En cuanto al procedimiento, haz siempre una copia antes de editar y edita por una via que siga funcionando con el sitio en 500, como SSH o FTP: editarlo desde el panel de WordPress es demoler el suelo que pisas. Anade en trozos pequenos y comprueba en el navegador tras cada uno: anade diez lineas de golpe, encuentrate un 500 y quedaras reducido a una busqueda binaria. En alojamiento compartido, averigua de antemano si puedes leer el registro de errores, para no quedarte atascado cuando haga falta. |
| Bucles de redireccion y un 301 que no puedes retirar | Escribir a la vez el forzado de HTTPS y la canonicalizacion de www produce un bucle infinito segun el orden de las condiciones. Sobre todo cuando delante hay un balanceador o una CDN: la peticion llega siempre al servidor por HTTP, de modo que %{HTTPS} permanece en off para siempre y la redireccion se repite sin fin; el sintoma es ERR_TOO_MANY_REDIRECTS. Y la naturaleza del 301 lo agrava: 301 significa permanente, asi que los navegadores lo cachean con fuerza y siguen ejecutando la redireccion antigua incluso despues de que arregles la configuracion. El resultado es ese estado en el que lo has arreglado y sigue roto, y sigues tocando la configuracion y empeoras las cosas: el patron que mas tiempo cuesta en esta clase de problemas. |
Si estas detras de un proxy, mira %{HTTP:X-Forwarded-Proto}. Escribir RewriteCond %{HTTP:X-Forwarded-Proto} !https da una decision correcta incluso a traves de una CDN. Y verifica siempre con curl -I en lugar de con un navegador: curl no cachea redirecciones, asi que siempre ves el resultado de la configuracion actual. Mientras construyes, usa 302, confirma que el comportamiento es el que pretendias y solo entonces cambialo a 301: ese orden por si solo evita practicamente todos los incidentes causados por la cache. Si ya has servido un 301 equivocado, el unico remedio es servir un nuevo 301 hacia el destino correcto: no puedes vaciar desde tu lado la cache del navegador de nadie. Y manten las reglas de redireccion en un solo sitio: repartidas entre varios .htaccess y la configuracion de la aplicacion, el origen de un bucle se vuelve imposible de rastrear. |
Un .htaccess de subdirectorio anula las reglas del padre |
Un .htaccess se aplica de forma jerarquica, pero las reglas de mod_rewrite se sustituyen en lugar de heredarse. En cuanto escribes una sola RewriteRule en un subdirectorio, las reglas de reescritura del padre dejan de aplicarse en ese directorio: el forzado de HTTPS y la canonicalizacion de www quedan muertos alli y solo alli. Lo que lo hace dificil de notar es que las demas directivas (autenticacion, cache, cabeceras) se heredan con normalidad, lo que produce el comportamiento contraintuitivo de que solo algunas cosas se heredan. En relacion con esto, un subdirectorio puede necesitar un RewriteBase, y olvidarlo hace que las rutas relativas se resuelvan contra la ruta del padre, provocando 404 o bucles. |
Si puedes, no uses .htaccess en absoluto: escribe la configuracion en la del servidor. En un VPS o un servidor dedicado puedes ponerla en un bloque <Directory>, lo que ademas es mas rapido, porque desaparece la busqueda y lectura del archivo en cada peticion (con AllowOverride None, Apache ni siquiera lo busca). Si el alojamiento compartido solo te deja .htaccess, consolida las reglas de reescritura en un unico archivo padre y evita colocar cualquier RewriteRule en subdirectorios. Si de verdad necesitas una, RewriteOptions Inherit arrastra las reglas del padre, pero cambia el orden en que se aplican, asi que verifica cada patron solicitandolo de verdad. |
Las cabeceras de seguridad no te vuelven seguro por el mero hecho de estar. X-Frame-Options y Content-Security-Policy cierran tecnicas de ataque concretas y no hacen nada frente a las vulnerabilidades de tu aplicacion: subir la puntuacion de un escaner y ser realmente seguro son cosas distintas. En particular, Content-Security-Policy rompera tu propio JavaScript si lo configuras mal: empieza con Content-Security-Policy-Report-Only, observa lo que informa y solo entonces pasa a la cabecera que aplica. Ademas, las restricciones de acceso en .htaccess solo valen cuando el archivo se sirve a traves de Apache: en un montaje donde nginx sirve los estaticos directamente por delante, el .htaccess no se lee jamas. Guardar los archivos confidenciales fuera del directorio publico es la respuesta correcta; ocultarlos con una regla de acceso es el recurso de reserva. Y, cosa que se olvida con facilidad: manten el propio .htaccess bajo control de versiones: un archivo de configuracion en el que nadie sabe quien anadio que ni cuando acaba siendo uno que nadie se atreve a tocar.
📖 Cómo usar
-
1
Elige funcionesMarca las casillas de las funciones deseadas. La vista previa se actualiza en vivo.
-
2
Introduce el dominioSi usas canonicalización www, indica tu dominio. No es necesario para solo HTTPS.
-
3
Copia o descargaUsa los botones para copiar o descargar como archivo. Revísalo antes de subirlo.
-
4
Sube al servidorColoca el archivo como .htaccess en la raíz del documento. Haz copia de seguridad si ya existe.
❓ Preguntas frecuentes
¿Funciona .htaccess fuera de Apache?
¿Qué hacer si aparece un error 500?
¿Funciona en hosting compartido (Xserver / Sakura)?
🔗 Herramientas relacionadas
🐛 ¿Encontró un problema con esta herramienta?
Gratis, sin registro. Incluso solo los pasos para reproducir ayudan. Los informes van directamente al operador y se usan para corregir.
¡Gracias por tu reporte!
Tu reporte llegó al operador y se usará para mejorar.