Evitar mostrar algunos archivos y a la vez ciertos parámetros en la url con htacess

  • Autor Autor kahlito
  • Fecha de inicio Fecha de inicio
kahlito

kahlito

Curioso
Verificado por Whatsapp
¡Usuario con pocos negocios! ¡Utiliza siempre saldo de Forobeta!
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

Insertar CODE, HTML o PHP:
<?php

/*=============================================
CONTENIDO DINÁMICO
=============================================*/

$rutas = array();
$ruta = null;

if(isset($_GET["ruta"])){   

    $rutas = explode("/", $_GET["ruta"]);       

    /*=============================================
    LISTA BLANCA DE URL'S AMIGABLES
    =============================================*/

    if($rutas[0] == "inicio" || $rutas[0] == "contacto"){
        
        include $rutas[0].".php";                       

    }else{       

        header('Location: inicio');           

    }

}else{

    include "inicio.php";

}

?>

Insertar CODE, HTML o PHP:
htaccess

[HIGHLIGHT="Apache"]# Impedir que se pueda ver el listado de contenidos de un directorio
Options All -Indexes

RewriteEngine On
RewriteBase /
RewriteRule ^([-a-zA-Z0-9ñÑ_/]+)$ index.php?ruta=$1


RewriteCond %{SERVER_PORT} !=443
RewriteRule ^(.*)$ https://midominio.com/$1 [R=301,L]

# Redirigir la URL con www a la dirección sin www
RewriteCond %{HTTP_HOST} ^www.midominio.com
RewriteRule ^(.*)$ https://midominio.com/$1 [R=301,L][/HIGHLIGHT]

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
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
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.
 
Hola de nuevo.

Finalmente gracias a la ayuda de otro usuario lo he arreglado así:

index.php

PHP:
/*=============================================

CONTENIDO DINÁMICO

=============================================*/


//ruta => [nombre-de-ruta-para-menú-o-título, archivo-a-incluir]


$rutas = [

    'inicio' => ['Inicio', 'inicio.php'],

    'contacto' => ['Contacto', 'contacto.php']

];

// Obtener ruta desde $_GET o inicializar como cadena vacía:

$ruta = (isset($_GET['ruta'])) ? $_GET['ruta'] : '';


// Forzar que 'inicio' no aparezca como parámetro en URL

if($ruta == 'inicio') {

    // Redirige a raíz del sitio

    header('Location: https://midominio.com/');

}


// Hay diagonales?

$params = explode('/', $ruta);

$abrir = ($params[0] == '') ? 'inicio' : $params[0];

// Verificar que la ruta existe

if(isset($rutas[$abrir])) {

    // Si hay más de 1 parámetro, es porque hay diagonal al final

    if(count($params) > 1) {

        // Redirigir sin diagonal

        header("Location: https://midominio.com/$abrir");

    }

    // Incluir archivo de ruta

    include $rutas[$abrir][1];

    // Finalizar script

    exit;

}

// Aquí mostrar una página con error 404: No encontrada

include 'error404.php';

htaccess


Insertar CODE, HTML o PHP:
# -- Impedir que se pueda ver el listado de contenidos de un directorio

Options -Indexes


RewriteEngine On

RewriteBase /


# -- Evitar mostrar en la url archivo.php?ruta=parametro

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /([^?]*)\?

RewriteRule (.*) /$1? [R=301,L]


# -- Evitar que se abra index.php

RewriteCond %{THE_REQUEST} ^.*/index\.php

RewriteRule ^(.*)index.php$ https://midominio.com/ [R=301,L]


# -- Redirigir cualquier '/ruta.php' a '/ruta', quitando la extensión .php

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /([^\ ]+)\.php

RewriteRule ^/?(.*)\.php$ https://midominio.com/$1 [L,R=301]


# -- Redirigir la URL a https

RewriteCond %{SERVER_PORT} !=443

RewriteRule ^(.*)$ https://midominio.com/$1 [R=301,L]


# -- Redirigir la URL con www a la dirección sin www

RewriteCond %{HTTP_HOST} ^www.midominio.com

RewriteRule ^(.*)$ https://midominio.com/$1 [R=301,L]


# --No existe archivo !-f, no existe directorio !-d

RewriteCond %{REQUEST_FILENAME} !-f

RewriteCond %{REQUEST_FILENAME} !-d


ErrorDocument 404 /error404.php

ErrorDocument 403 /index.php


RewriteRule ^([-a-zA-Z0-9ñÑ_/.]+)$ index.php?ruta=$1


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

Saludos.
 
Atrás
Arriba