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

 
Vista:
Imágen de perfil de José Carlos
Val: 31
Ha disminuido su posición en 5 puestos en PHP (en relación al último mes)
Gráfica de PHP

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

Publicado por José Carlos (15 intervenciones) el 23/06/2020 12:44:31
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?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";
}
?>

htaccess

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 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]

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.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de José Carlos
Val: 31
Ha disminuido su posición en 5 puestos en PHP (en relación al último mes)
Gráfica de PHP

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

Publicado por José Carlos (15 intervenciones) el 26/06/2020 13:18:36
Hola de nuevo.

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

index.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
/*=============================================
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# -- 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.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar