entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

2votos

URL "amigables" desde .htaccess con varias reglas

La duda es la siguiente: Tengo en mi htaccess lo siguiente:

<IfModule mod_rewrite.c>
RewriteEngine ON
RewriteCond %{QUERY_STRING}  !\?seccion=
# If the request is not for a valid directory
RewriteCond %{REQUEST_FILENAME} !-d
# If the request is not for a valid file
RewriteCond %{REQUEST_FILENAME} !-f
# If the request is not for a valid link
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^(.+)$ /?seccion=$1 [L]
</IfModule>

Lo que hace esto es entender urls amigables, como ya se explico de donde viene esta pregunta.

Ahora la siguiente duda es que quiero añadir una nueva regla, es decir, que entienda las siguiente urls: http://midominio.com/miseccion/pagina/2, que cuando le mande por url esa estructura la sepa entender el servidor.

Ahora mismo entiende esto: http://midominio.com/miseccion&pg=2

1 Respuesta

2votos

carlossevi Puntos63580

Tras unas cuentas pruebas creo que he dado con la solución:

<IfModule mod_rewrite.c>
RewriteEngine ON
RewriteCond %{QUERY_STRING}  !\?seccion=
# If the request is not for a valid directory
RewriteCond %{REQUEST_FILENAME} !-d
# If the request is not for a valid file
RewriteCond %{REQUEST_FILENAME} !-f
# If the request is not for a valid link
RewriteCond %{REQUEST_FILENAME} !-l
# REGLAS:
# Para //dominio.com/misec/pagina/2 > //dominio.com/?seccion=misec&pg=2
RewriteRule ^(\w+)/pagina/(\w+)/?$ /?seccion=$1&pg=$2 [L]
# Para //dominio.com/misec > //dominio.com/?seccion=misec
RewriteRule ^(\w+)/?$ /?seccion=$1 [L]
</IfModule>

Importante el cambio de (.+) por (\w+) que sustituye el "any character" por "any word character".

Muy importante: siempre debe ponerse la regla más compleja arriba, seguida por el [L] que significa que no se sigan comprobando más reglas si esa se cumple.

0voto

danielreales7 comentado

Lo he probado y sigue sin salirme, en realidad me manda bien la url, pero es como si no me cogiera la web los estilos ni nada. ¿Sabes lo que te quiero decir?

Y por ejemplo tengo una url en la que me manda varios guiones, por ejemplo, miseccion-miseccion y me da un error de no encontrado:
Not Found

The requested document was not found on this server.

0voto

danielreales7 comentado

Lo de los guiones de la seccion me ha pasado con el nuevo código que me has mandado, con el que tenía funciona perfectamente.

0voto

carlossevi comentado

Dos cuestiones diferentes:

En primer lugar, respecto a los guiones: es debido al cambio de (.+) por (\w+) que explicaba arriba. El guión - no es un caracter "de palabras" por lo que no es reconocido por la regla. No puedes dejar la regla con (.+) ya que entonces el caracter / sería reconocido como parte de la cadena de nombre de sección y no como un separador. Lo mejor sería evitar ese tipo de nombre (sí podría utilizar guión bajo).

En segundo lugar, el error que comentas de que no se cargan los estilos suele estar relacionado con que las redirecciones afectan también a la petición de los archivos CSS, JS, jpg... seguramente hay una interferencia que hace que el servidor no devuelva correctamente el archivo CSS. ¿Qué formato tiene la URL del archivo CSS?

0voto

danielreales7 comentado

Literalmente son los de bootstrap, algunos tienen un . de por medio y otros son algunos personales, pero sin nada especial.

0voto

carlossevi comentado

Pensaba que con la regla que no se ejecuta si es un fichero válido debería servir (RewriteCond %{REQUEST_FILENAME} !-f), pero ya te digo que no tengo excesiva experiencia y sin acceso al entorno para realizar pruebas es un poco complicado.

Yo probaría a introducir esta regla en primer lugar:

# Allow any files or directories that exist to be displayed directly
RewriteCond ${REQUEST_URI} ^.+$
RewriteCond %{REQUEST_FILENAME} \.(gif|jpe?g|png|js|css|swf|php|ico|txt|pdf|xml)$ [OR]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_FILENAME} -l
RewriteRule ^ - [L]

Esto hace que si el fichero existe no haga caso de las reglas que vienen a continuación. El fichero completo debería quedar:

<IfModule mod_rewrite.c>
RewriteEngine ON
# Allow any files or directories that exist to be displayed directly
RewriteCond ${REQUEST_URI} ^.+$
RewriteCond %{REQUEST_FILENAME} \.(gif|jpe?g|png|js|css|swf|php|ico|txt|pdf|xml)$ [OR]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_FILENAME} -l
RewriteRule ^ - [L]
# Reescrituras URL amigables
RewriteCond %{QUERY_STRING}  !\?seccion=
# Para //dominio.com/misec/pagina/2 > //dominio.com/?seccion=misec&pg=2
RewriteRule ^(\w+)/pagina/(\w+)/?$ /?seccion=$1&pg=$2 [L]
# Para //dominio.com/misec > //dominio.com/?seccion=misec
RewriteRule ^(\w+)/?$ /?seccion=$1 [L]
</IfModule>

0voto

danielreales7 comentado

He probado con esa regla que me has comentado y nada, sigue apareciendo la web sin los estilos y el javascript.
¿Será problema de los php? o sigue siendo del .htaccess

Muchas gracias por tu ayuda!

0voto

carlossevi comentado

Para descartar otro tipo de problema (casi seguro que es de esto que estás tocando) intenta acceder directamente al fichero de los estilos CSS. Si no puedes cargarlo será por estas reglas.

Dinos cuales son las URL de esos ficheros porque si están en una misma carpeta pueden ponerse excepciones para evitar que las reglas de reescritura les afecten.

0voto

danielreales7 comentado

Si yo accedo a http://midominio.com/css/style.css si me muestra el archivo css. Ahí es donde están todos los archivos css. Al igual que los de javascript están en su carpeta js.

¿Eso es lo que me querías decir no?

0voto

white comentado

para una mejor deduccion danos tu codigo que esta entre <header> y </header> para ver que no se haya visto afectado la ruta de los .css y .js esto viendo el codigo fuente de la pagina, para ver lo procesado
tambien reviza con la consola de tu navegador si te devuelve un error de estado con algun recurso (404, etc)

0voto

carlossevi comentado

Si eres capaz de ver el archivo css es raro que sea un problema de la reescritura de URL. Haz lo que comenta white y fíjate en las herramientas para desarrollo de Firefox y Chrome en el apartado de Red para ver si todas las peticiones se resuelven correctamente o alguna da un error.

0voto

danielreales7 comentado

Lo siento por tardar en contestar.
Acabo de fijarme en el header y me indica las siguientes rutas de los archivos css y javascript:

<link rel="stylesheet" type="text/css" href="./bootstrap/css/bootstrap.min.css">

Y la url es la siguiente:

http://www.midominio.com/miseccion/pagina/2

Entiendo que estará buscando en el raíz de "2"

Si cambio esas rutas la página primera normal que aparece no mostraría bien los datos, tendría que cambiar la ruta de esos estilos al pasar de página no?

Muchas gracias.

0voto

carlossevi comentado

Comprueba lo que pedíamos white y yo sobre la peticiones que hace el navegador (opciones de desarrollo) y así podrás ver qué peticiones no se resuelven correctamente (la URL completa que solicita).

0voto

danielreales7 comentado

Tengo 18 errores de archivos javascript que tienen la misma ruta que los css pero a su carpeta js.
De un par de funciones que tengo con jQuery que entiendo porque no me está cargando las librerías y esto:

Failed to load resource: net::ERR_CACHE_MISS

En la siguiente url:

http://www.midominio.com/seccion/pagina/2

0voto

danielreales7 comentado

Ah y esto:

 Resource interpreted as Stylesheet but transferred with MIME type text/html: "http://www.midominio.com/miseccion/pagina/bootstrap/css/bootstrap.min.css".

Con más archivos css y javascript

1voto

white comentado

el problema viene del htaccess en: RewriteRule ^(\w+)/pagina/(\w+)/?$ /?seccion=$1&pg=$2 [L]

talvez con una expresion regular diferente podria funcionar: RewriteRule ^([a-zA-Z0-9]+)/pagina/([0-9]+)/?$ /?seccion=$1&pg=$2 [L]

EDIT: no vi tu ruta, olvida lo que dije C:

0voto

carlossevi comentado

Al enlace al css le sobra el punto . delante de la barra /.
Debes sustituir:

<link rel="stylesheet" type="text/css" href="./bootstrap/css/bootstrap.min.css">

Por:

<link rel="stylesheet" type="text/css" href="/bootstrap/css/bootstrap.min.css">

Cuando el enlace empieza por / indica que la ruta es a partir del nombre del dominio.

0voto

danielreales7 comentado

Al hacer eso me ha recuperado los estilos, pero me acabo de fijar que en vez de ir a la página 2 lo que hace es mostrarme el index de la web.

0voto

carlossevi comentado

Con las reglas de arriba puedes comprobar en este servicio de test online que la petición http://midominio/misec/pagina/2 es traducida por http://midominio/?seccion=misec&pg=2.

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta