Duda con las rutas amigables de mi web

Iniciado por Hekaly, 13 Noviembre 2012, 13:36 PM

0 Miembros y 1 Visitante están viendo este tema.

Hekaly

Buenas a todos.

Venia a preguntaros una duda que tengo sobre las URL. Resulta que en mi web el archivo index.php esta en la raiz y después tengo una carpeta llamada include donde estan los archivos, menu.php, sidebar.php, etc y ademas tengo la carpeta secciones con varios archivos php (1 por sección).

Bien, cuando quiero ver por ejemplo una noticia la url me pone lo siguiente localhost/dominio/includes/secciones/noticias.php?id=xxx (siendo xxx el id de noticia).

Y quiero convertirlo es en dominio.org/noticias/TITULO_NOTICIA

Lo que me importa es como hacer para quitar "/includes/secciones" ya que no me gutaria que un usuario sepa las rutas reales de los archivos.

Quitando por hecho que localhost/dominio es por que estoy en local y se transformara en dominio.com al subirlo a un servidor web..., se que con las opciones RewriteEngine/
RewriteBase/RewriteCond/RewriteRule del htaccess puedo llegar a quitar las extensiones de los archivos asi como evitar ver las variables y ponerlas tipo noticias/TITULO_NOTICIA/, ahora bien, se puede hacer con htacces quitar parte de la ruta local "includes/secciones"?

Probe a usar esto.

RewriteEngine On
RewriteRule ^([a-zA-Z0-9_-]+)$ fichaJuego.php?id=$1
RewriteRule ^([a-zA-Z0-9_-]+)/includes/secciones/$ fichaJuego.php?id=$1


RewriteEngine On
RewriteRule ^([a-zA-Z0-9_-]+)/([0-9]+)$ fichaJuego.php?id=$1&juego=$2
RewriteRule ^([a-zA-Z0-9_-]+)/([0-9]+)/includes/secciones/$ fichaJuego.php?id=$1&juego=$2


y esto

RewriteEngine On
RewriteRule ^([a-zA-Z0-9_-]+)$ fichaJuego.php?id=$1
RewriteRule ^([a-zA-Z0-9_-]+)/$ fichaJuego.php?id=$1


RewriteEngine On
RewriteRule ^([a-zA-Z0-9_-]+)/([0-9]+)$ fichaJuego.php?id=$1&juego=$2
RewriteRule ^([a-zA-Z0-9_-]+)/([0-9]+)/$ fichaJuego.php?id=$1&juego=$2


Pero cuando abro la web me da error 500, como si no encontrase ningun archivo.

Tengo entendido que php tiene funciones para coger por variable la PATH, se podria hacer eso, quitar con substr "includes/secciones" y usar esa variable en los cada href, funcionaria??.

Hay alguna funcion en php para eliminar partes de la ruta absoluta??? o decirle al servidor que todo lo que este dentro de "includes/secciones" no lo muestre en la url?? o por el contrario deberia tener todos los archivos php de mi web en la raiz para evitar esto??

Espero que me puedan ayudar, muchas gracias.

#!drvy

Hola,

Código (apache) [Seleccionar]
<IfModule mod_rewrite.c>
Options +FollowSymLinks
RewriteEngine On

# Si el archivo no es un directorio
RewriteCond %{REQUEST_FILENAME} !-d

# Al solicitar dominio.com/noticias/1
# lo procesara como dominio.com/includes/secciones/noticias.php?id=1
# sin mostrar la ruta completa.
RewriteRule ^noticias/([A-Za-z0-9-]+)/?$ includes/secciones/noticias.php?id=$1 [L]

</IfModule>


Así suponiendo que noticias.php solo imprime la variable (get) id, el resultado de solicitar dominio.com/noticias/adasda1

Sera:
Código (log) [Seleccionar]
adasda1

Espero que te sirva.

Saludos

Hekaly

#2
Gracias por la rápida respuesta drvy | BSM.

He copiado el código y al pulsar en la noticia en concreto me sigue apareciendo la ruta completa. Seguramente tenga algo mal, seguiré mirando y probando con tu código.

http://infojuegos.org/includes/secciones/noticia.php?id=1

Aun así, la web ya la subí en su momento infojuegos.org.

Voy a mirar también con un juego de los que tengo de prueba a ver si me quita la maldita ruta /includes/secciones

Lo dicho, gracias y seguiré informando.

Un saludo.


Act: Por cierto drvy | BSM , he estado investigando y al parecer 1and1 tiene problemas con el archivo .htaccess y otras cositas, y como estoy en ese hosting es posible que no me funcione el codigo.

#!drvy

#3
Hola,

CitarHe copiado el código y al pulsar en la noticia en concreto me sigue apareciendo la ruta completa. Seguramente tenga algo mal, seguiré mirando y probando con tu código.

http://infojuegos.org/includes/secciones/noticia.php?id=1

Eso es completamente normal. Si pones la ruta completa, el script que te he pasado no tiene nada que hacer.

Para que funcione bien, necesitas cambiar el modo en el que tu pagina lleva los enlaces.
Así, tienes que hacer que en vez de que te lleve a http://infojuegos.org/includes/secciones/noticia.php?id=1, te lleve a http://infojuegos.org/noticias/1 cuando haces click en un enlace.

Vamos, que tienes que cambiar la forma en la que se manejan los enlaces en el codigo de tu pagina.

Puedes hacerlo todo mediante HTACCESS ? Si pero NO te lo recomiendo para nada.
Tendrías que redireccionar al usuario cada vez que este haga click en un enlace. Eso ralentiza tu pagina web y los buscadores tipo Google te penalizan por mostrarles 301 cada vez que inspeccionan un enlace en tu pagina.

Aquí tienes como hacerlo pero repito "NO TE LO RECOMIENDO PARA NADA".

Código (apache) [Seleccionar]
<IfModule mod_rewrite.c>
Options +FollowSymLinks
RewriteEngine On

# Si el archivo no es un directorio
RewriteCond %{REQUEST_FILENAME} !-d

# Al solicitar dominio.com/noticia/1
# lo procesara como dominio.com/includes/secciones/noticia.php?id=1
# sin mostrar la ruta completa.
RewriteRule ^noticia/([A-Za-z0-9_-]+)/?$ includes/secciones/noticia.php?id=$1 [L]

# En caso de que el visitante acceda mediante la ruta completa
# redirigir a la ruta corta.

# Esto redirigiria dominio.com/includes/secciones/blalba.php?id=234234 a
# dominio.com/blalba/234234

RewriteCond %{THE_REQUEST} ^(GET|POST|HEAD)\ /includes/secciones/([A-Za-z0-9]+)\.php\?id=([A-Za-z0-9_-]+)
RewriteRule ^ http://dominio.com/%2/%3/? [L,R=301]
</IfModule>


Saludos

Hekaly

Buenas a todos.

Reanimo este hilo para seguir poniendo mis dudas sobre htaccess y no abrir otro distinto.

Al ser nuevo en este tema del desarrollo web tengo algunas dudas que aun no se solucionar.

La primero de todo dejo mi codigo htaccess tal y como lo tengo ahora (me falta meter mas rutas amigables, entre otros apartados).

Options All -Indexes
IndexIgnore *

<ifModule mod_php4.c>
php_value default_charset utf-8
</ifModule>


<IfModule mod_rewrite.c>
RewriteEngine on
RewriteBase /
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteRule ^(.*)$ $1.php
</IfModule>


Options +FollowSymLinks
RewriteEngine on
RewriteBase /
RewriteRule ^noticia/(.+)/(.+)/?$ noticia.php?id=$1&titulo=$2
RewriteRule ^juego/(.+)/(.+)/?$ fichaJuego.php?id=$1&consola=$2
RewriteRule ^consola/(.+)/?$ fichaplataformas.php?plataforma=$1
RewriteRule ^plataforma/(.+)/?$ plataformas.php?letra=$1
RewriteRule ^plataforma/generacion/(.+)/?$ plataformas.php?generacion=$1


Las preguntas son las siguientes.

1) La parte en la que quito las extensiones de los archivos las rutas me funcionan perfectamente si no pongo el .php al final, pero si lo pongo tambien sale la pagina, mi idea es que si el usuario escribe la extension no se pueda mostrar la pagina, o la mande al a un archivo de error (ErrorDocument /error/xxxxxxxx), eso se podria llegar hacer?

2) Cuando estoy haciendo una ruta amigables es nesesario que haya dos variables en la ruta real?
Me explico, en la entrada noticias uso la variable id y titulo y usando esas dos RewriteRule ^noticia/(.+)/(.+)/?$ noticia.php?id=$1&titulo=$2
la ruta me sale bien (http://infojuegos.org/noticia/1/Comienza%20una%20nueva%20aventura), pero si quiero hacer lo mismo con una pagina en la que utilizo solamente una variable, como por ejemplo plataformas en la que solo uso el nombre de la plataforma no me lo muestra.
RewriteRule ^consola/(.+)/?$ fichaplataformas.php?plataforma=$1
Eso por que ocurre? deberia cambia la forma en la uso las variable por get??

3) Esta duda es similar a la anterior, solo que si funciona pero a medias.

En esta ocacion tengo un listado y la idea es filtrar por una letra o por una generacion. Pero lo curioso que si uso el htaccess que tengo.
RewriteRule ^plataforma/(.+)/?$ plataformas.php?letra=$1
RewriteRule ^plataforma/generacion/(.+)/?$ plataformas.php?generacion=$1


Me aparece la consolas que empiezan por esa letra aparte de otras al igual que si pusiera una generacion, me salen las de esa mas otras.



4) Como hacer para obligar al usuario que use la ruta completa??? ejemplo.
Si yo tengo en la ruta amigable dominio.com/noticia/5/hola%20mundo y el usuario pone dominio.com/noticia/5 ó dominio.com/noticia/5/jhjhhjkhkggh No le aparezca nada, solo en el caso que lo ponga como es la ruta amigable.



Vemos que en las tres rutas se muestra lo mismo cuando solo deberia ser valida la primera opcion.

Muchas gracias por vuestas ayuda.
Un saludo.