Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Evitar mostrar algunos archivos y a la vez ciertos parámetros en la url con htaccess

Estas en el tema de Evitar mostrar algunos archivos y a la vez ciertos parámetros en la url con htaccess en el foro de PHP en Foros del Web. Buenos días. Estoy intentando arreglar o cambiar algunas rutas que aparecen en la url preparadas con .htaccess que o no deberían salir completas o incluso ...
  #1 (permalink)  
Antiguo 23/06/2020, 04:28
Avatar de kahlito
Colaborador
 
Fecha de Ingreso: marzo-2003
Ubicación: En el Estrecho y el mar
Mensajes: 2.935
Antigüedad: 17 años, 7 meses
Puntos: 65
Evitar mostrar algunos archivos y a la vez ciertos parámetros en la url con htaccess

Buenos días.

Estoy intentando arreglar o cambiar algunas rutas que aparecen en la url preparadas con .htaccess que o no deberían salir completas o incluso evitar que si el usuario pone algunas de estas se muestre cierto contenido.

Lo estoy haciendo de la siguiente manera:

Index.php

Código PHP:
Ver original
  1. <?php
  2.  
  3. /*=============================================
  4. CONTENIDO DINÁMICO
  5. =============================================*/
  6.  
  7. $rutas = array();
  8. $ruta = null;
  9.  
  10. if(isset($_GET["ruta"])){  
  11.  
  12.     $rutas = explode("/", $_GET["ruta"]);      
  13.  
  14.     /*=============================================
  15.     LISTA BLANCA DE URL'S AMIGABLES
  16.     =============================================*/
  17.  
  18.     if($rutas[0] == "inicio" || $rutas[0] == "contacto"){
  19.        
  20.         include $rutas[0].".php";                      
  21.  
  22.     }else{     
  23.  
  24.         header('Location: inicio');        
  25.  
  26.     }
  27.  
  28. }else{
  29.  
  30.     include "inicio.php";
  31.  
  32. }
  33.  
  34. ?>

htaccess

Código Apache:
Ver original
  1. # Impedir que se pueda ver el listado de contenidos de un directorio
  2. Options All -Indexes
  3.  
  4. RewriteEngine On
  5. RewriteBase /
  6. RewriteRule ^([-a-zA-Z0-9ñÑ_/]+)$ index.php?ruta=$1
  7.  
  8.  
  9. RewriteCond %{SERVER_PORT} !=443
  10. RewriteRule ^(.*)$ https://midominio.com/$1 [R=301,L]
  11.  
  12. # Redirigir la URL con www a la dirección sin www
  13. RewriteCond %{HTTP_HOST} ^www.midominio.com
  14. RewriteRule ^(.*)$ https://midominio.com/$1 [R=301,L]

Hasta aquí lo que logro es que cuando el usuario ponga en la url o el dominio completo o una de las dos palabras de la lista blanca como "inicio" o "contacto" cargue correctamente el contenido, por ejemplo así:

https://midominio.com/
https://midominio.com/inicio
https://midominio.com/contacto

Y si por ejemplo una persona escribe otra palabra que no sea una de las de la lista blanca redirige a inicio, ejemplo:

https://midominio.com/algo -> https://midominio.com/

Hasta aquí todo bien, sin embargo veo varios errores que no deberían ocurrir o al menos no se como evitar por ahora, por ejemplo:

1- Si el usuario añade una barra final "/" y escribe https://midominio.com/inicio/ el dominio carga sin su hoja de estilos, por lo tanto aquí ¿debo de aplicar una redirección a la ruta sin "/"?

2- Si el usuario escribe o añade un carácter no permitido como "." por ejemplo https://midominio.com/inicio. me muestra un directorio de opciones y documentos disponibles
Cita:
Multiple Choices. The document name you requested (/inicio.) could not be found on this server. However, we found documents with names similar to the one you requested.
Available documents: /inicio.php (common basename)
¿Aquí debo de evitarlo también con una redirección 301?

3- Si el usuario intenta ver un directorio, por ejemplo el de imágenes https://midominio.com/imagenes en vez de evitarlo y redirigir a inicio me da un error de redirección
Cita:
Esta página no funcionaLa página midominio.com te ha redirigido demasiadas veces.
Borrar las cookies.
ERR_TOO_MANY_REDIRECTS
4- Si el usuario escribe https://midominio.com/contacto?ruta=contacto o
https://midominio.com/index.php?ruta=inicio/ me cargan correctamente sin embargo me gustaría que en la url solo se pueda ver como mucho https://midominio.com/inicio o https://midominio.com/contacto

5- Si el usuario escribe https://midominio.com/index.php carga perfectamente sin embargo me gustaría ver como hacer que no aparezca la extensión "php" y tampoco la palabra index. Aquí he probado varias opciones con RewriteCond y RewriteRule pero tampoco me funcionan.

En general ¿qué podría añadir o eliminar de lo actual?

Saludos.
  #2 (permalink)  
Antiguo 26/06/2020, 05:10
Avatar de kahlito
Colaborador
 
Fecha de Ingreso: marzo-2003
Ubicación: En el Estrecho y el mar
Mensajes: 2.935
Antigüedad: 17 años, 7 meses
Puntos: 65
Respuesta: Evitar mostrar algunos archivos y a la vez ciertos parámetros en la url co

Hola de nuevo.

Finalmente gracias a la gran ayuda de Triby lo he arreglado así:

index.php

Código PHP:
Ver original
  1. /*=============================================
  2. CONTENIDO DINÁMICO
  3. =============================================*/
  4.  
  5. //ruta => [nombre-de-ruta-para-menú-o-título, archivo-a-incluir]
  6.  
  7. $rutas = [
  8.     'inicio' => ['Inicio', 'inicio.php'],
  9.     'contacto' => ['Contacto', 'contacto.php']
  10. ];
  11. // Obtener ruta desde $_GET o inicializar como cadena vacía:
  12. $ruta = (isset($_GET['ruta'])) ? $_GET['ruta'] : '';
  13.  
  14. // Forzar que 'inicio' no aparezca como parámetro en URL
  15. if($ruta == 'inicio') {
  16.     // Redirige a raíz del sitio
  17.     header('Location: https://midominio.com/');
  18. }
  19.  
  20. // Hay diagonales?
  21. $params = explode('/', $ruta);
  22. $abrir = ($params[0] == '') ? 'inicio' : $params[0];
  23. // Verificar que la ruta existe
  24. if(isset($rutas[$abrir])) {
  25.     // Si hay más de 1 parámetro, es porque hay diagonal al final
  26.     if(count($params) > 1) {
  27.         // Redirigir sin diagonal
  28.         header("Location: https://midominio.com/$abrir");
  29.     }
  30.     // Incluir archivo de ruta
  31.     include $rutas[$abrir][1];
  32.     // Finalizar script
  33.     exit;
  34. }
  35. // Aquí mostrar una página con error 404: No encontrada
  36. include 'error404.php';

htaccess

Código Apache:
Ver original
  1. # -- Impedir que se pueda ver el listado de contenidos de un directorio
  2. Options -Indexes
  3.  
  4. RewriteEngine On
  5. RewriteBase /
  6.  
  7. # -- Evitar mostrar en la url archivo.php?ruta=parametro
  8. RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /([^?]*)\?
  9. RewriteRule (.*) /$1? [R=301,L]
  10.  
  11. # -- Evitar que se abra index.php
  12. RewriteCond %{THE_REQUEST} ^.*/index\.php
  13. RewriteRule ^(.*)index.php$ https://midominio.com/ [R=301,L]
  14.  
  15. # -- Redirigir cualquier '/ruta.php' a '/ruta', quitando la extensión .php
  16. RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /([^\ ]+)\.php
  17. RewriteRule ^/?(.*)\.php$ https://midominio.com/$1 [L,R=301]
  18.  
  19. # -- Redirigir la URL a https
  20. RewriteCond %{SERVER_PORT} !=443
  21. RewriteRule ^(.*)$ https://midominio.com/$1 [R=301,L]
  22.  
  23. # -- Redirigir la URL con www a la dirección sin www
  24. RewriteCond %{HTTP_HOST} ^www.midominio.com
  25. RewriteRule ^(.*)$ https://midominio.com/$1 [R=301,L]
  26.  
  27. # --No existe archivo !-f, no existe directorio !-d
  28. RewriteCond %{REQUEST_FILENAME} !-f
  29. RewriteCond %{REQUEST_FILENAME} !-d
  30.  
  31. ErrorDocument 404 /error404.php
  32. ErrorDocument 403 /index.php
  33.  
  34. RewriteRule ^([-a-zA-Z0-9ñÑ_/.]+)$ index.php?ruta=$1

Lo dejo por aquí por si también le puede servir a alguien.

Saludos.

Última edición por kahlito; 26/06/2020 a las 09:23



La zona horaria es GMT -6. Ahora son las 12:13.