Foros del Web » Administración de Sistemas » Apache »

Regla para una condición, pero no para otra, en .htaccess

Estas en el tema de Regla para una condición, pero no para otra, en .htaccess en el foro de Apache en Foros del Web. Estimados, Tengo una duda respecto al htaccess, el tema es el siguiente: Tengo en el .htaccess: RewriteRule ^(.*)/index.htm$ /carpeta/index.htm [L] Las siguentes páginas, al cumplir ...
  #1 (permalink)  
Antiguo 23/01/2012, 08:26
 
Fecha de Ingreso: febrero-2008
Mensajes: 578
Antigüedad: 16 años, 1 mes
Puntos: 3
Regla para una condición, pero no para otra, en .htaccess

Estimados,

Tengo una duda respecto al htaccess, el tema es el siguiente:

Tengo en el .htaccess:
RewriteRule ^(.*)/index.htm$ /carpeta/index.htm [L]

Las siguentes páginas, al cumplir las reglas me dirigen, y está bien, como ser:
www.misitio.com/carpeta1/index.htm
www.misitio.com/carpeta2/index.htm

Pero supongamos que no quiero que la regla se cumpla para estas 2:
www.misitio.com/carpeta3/carpeta4/index.htm
www.misitio.com/carpeta5/index.htm

¿Como puedo hacer esto?
Puse un ejemplo corto, ya que todo estas url son generadas por base de datos, pero partiendo de:
RewriteRule ^(.*)/index.htm$ /carpeta/index.htm [L]

como hago para que las otras urls no tomen esa regla ?

Espero puedan ayudarme.

Saludos
  #2 (permalink)  
Antiguo 25/01/2012, 12:28
Avatar de emprear
Colaborador
 
Fecha de Ingreso: junio-2007
Ubicación: me mudé
Mensajes: 8.388
Antigüedad: 16 años, 9 meses
Puntos: 1567
Respuesta: Regla para una condición, pero no para otra, en .htaccess

@Jamati

En primer lugar las regla que ponés
Código Apache:
Ver original
  1. RewriteRule ^(.*)/index.htm$ /carpeta/index.htm [L]
y decis que te funciona, no debería funcionar, ya que te crearía un loop y produciría un error 500, si te está funcionando, no sé que otra configuración deba estar afectando. analizala
La regla dice que:
cualquier cosa --> (.*)
seguida de /index.htm
debe redirigirte a --> /carpeta/index.htm,
ahora pensá
/carpeta/index.htm
cumple la condición?
SI, entonces volvería a redirigirte y asi indefinidamente.
Una regla correcta sería
Código Apache:
Ver original
  1. RewriteRule ^(.*)/index.htm$ /carpeta/index.html [L]
porque como se aprecia el destino es .html, no .htm (se podría hacer al reves, poner .html en la expresión y dejar .htm en destino)

Concretamente por lo que preguntás debería ser asi

Código Apache:
Ver original
  1. Options +Indexes +FollowSymLinks
  2. RewriteEngine On
  3. # con los siguientes rewriteCond decimos que si la url llamada
  4. # no es
  5. RewriteCond %{REQUEST_URI} !^/carpeta3/index\.htm$
  6. # ni tampoco es
  7. RewriteCond %{REQUEST_URI} !^/carpeta3/carpeta4/index\.htm$
  8. # Ejecute la redirección (con la corrección que indiqué al inicio)
  9. RewriteRule ^(.*)/index.htm$ /carpeta/index.html [L]

Parala verificación, deberías tener creada en tu raiz, la carpeta y el archivo de destino

/carpeta/index.html

y el html con los vinculos seria
Código HTML:
Ver original
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0
  2. Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml">
  4. <title>titulo</title>
  5. <meta http-equiv="content-type" content="text/html; charset=utf-8" />
  6. </head>
  7. <a href="/carpeta1/index.htm">/carpeta1/index.htm</a><br />
  8. <a href="/carpeta2/index.htm">/carpeta2/index.htm</a><br />
  9. <a href="/carpeta3/index.htm">/carpeta3/index.htm</a><br />
  10. <a href="/carpeta3/carpeta4/index.htm">/carpeta3/carpeta4/index.htm</a><br />
  11. </body>
  12. </html>

Ese ejemplo es muy puntual, adaptarlo al conjunto de toda tu aplicación, no necesariamente tiene que funcionar. Si supieses de antemano que links hay que ignorar, probablemente funcione, pero si los links a ignorar se generan aleatoriamente a partir de una BD, no, ya que no estarían definidos en el .htaccess

Cuando contesto este tipo de posts en Apache, siempre insisto en que se debe de tener muy en claro que se quiere conseguir y como debe de trabajar todo en su conjunto. Muchas veces usar modRewrite no es la mejor alternativa o la solución más simple.
Algo que funcione parcialmente puede que falle al aplicarse al todo

Saludos
__________________
La voz de las antenas va, sustituyendo a Dios.
Cuando finalice la mutación, nueva edad media habrá
S.R.
  #3 (permalink)  
Antiguo 25/01/2012, 15:19
 
Fecha de Ingreso: febrero-2008
Mensajes: 578
Antigüedad: 16 años, 1 mes
Puntos: 3
Respuesta: Regla para una condición, pero no para otra, en .htaccess

Hola emprear,

Como siempre mil gracias.
Escribiendo así tal cual me lo indicaste, no funcionó...

pero hice unos cambios en el RewriteCond y ahora me funciona perfecto, por ejemplo, me quedó así:

Código:
RewriteCond %{REQUEST_URI} !/(carpeta3|carpeta4)
RewriteRule ^(.*)/index.php$			sitios/index.php [NC,L]
Respecto a lo que me decís de la regla que se crearía un loop infinito, no me ocurre eso, sino que me funciona todo bien. Entiendo lo que me decís, pero tampoco entiendo porque así como te lo puse recién, es decir sin cambiar la extensión del archivo, me funciona.
  #4 (permalink)  
Antiguo 25/01/2012, 16:02
Avatar de emprear
Colaborador
 
Fecha de Ingreso: junio-2007
Ubicación: me mudé
Mensajes: 8.388
Antigüedad: 16 años, 9 meses
Puntos: 1567
Respuesta: Regla para una condición, pero no para otra, en .htaccess

Lo del loop, no sabria decirte, hay directivas para prevenir el error limitando el numero máximo de solicitudes (evitan el error, pero no cumplen el objetivo), quizás haya alguna en el archivo de configuración principal, o algun cambio segun la version de apache.

En cuanto a lo segundo, lo que modifica toda la situación es la expresion que usaste

!/(carpeta3|carpeta4)
que indica que la url pedida no tiene que contener
/carpeta3
ó
/carpeta4
en cualquier posición y sin importar que haya mas texto después
la mía es mucho mas estricta

!^/carpeta3/index\.htm$
NO debe ser TODO eso, que comienze con /carpeta3/index.htm y termine con .htm (por eso el uso de ^ y $). Por eso te puse 2 cond por separado


imagina que vos tenes
/carpeta3/carpeta4/a
/carpeta3/carpeta4/b
pero no querés excluir a, en los dos casos la regla se cumpliría y sería excluida

Pero como ya te dije, depende del conjunto, y si lo que pusiste cumple con tus necesidades, esta PERFECTO

Saludos
__________________
La voz de las antenas va, sustituyendo a Dios.
Cuando finalice la mutación, nueva edad media habrá
S.R.
  #5 (permalink)  
Antiguo 26/01/2012, 10:19
 
Fecha de Ingreso: febrero-2008
Mensajes: 578
Antigüedad: 16 años, 1 mes
Puntos: 3
Respuesta: Regla para una condición, pero no para otra, en .htaccess

Perecto como siempre,

Y por último, y agradeciendo tus explicaciones, me aprovecho tus conocimientos para hacerte dos consultas mas:

1) Cual es la diferencia en el .htaccess de poner:
(.*)
([a-zA-Z0-9]*)

2) Tengo en el htaccess una regla para generar URL amigables, por ejemplo:

RewriteRule ^(.*)/(.*)_id([0-9]*)\.php$ articulos/articulo.php?id=$3 [NC,L]

Funciona perfecto para los siguientes enlaces:
http://www.misitio.com/carpeta1/probandotodo_id10.php
http://www.misitio.com/carpeta2/holacomoestas_id50.php
http://www.misitio.com/carpeta3/cualquiercosa_id35.php

Pero si escribo lo siguiente también funciona:
http://www.misitio.com/car1/car2/cualquiercosa_id35.php
http://www.misitio.com/car1/car2/car...rcosa_id35.php
http://www.misitio.com/car1/car2/car...rcosa_id35.php

Y así agregando carpetas en la URL, y me trae la página y funciona perfecto, pero obviamente me arma mal los links y toma erróneamente el CSS, etc... un montón de cosas que no quiero que pasen, y prefiero que cn htaccess se redirija automaticamente a la primer carpeta por ejemplo, es decir, si ingreso:

http://www.misitio.com/car1/car2/car...rcosa_id35.php

quiero que se redirija a:

http://www.misitio.com/car1/cualquiercosa_id35.php

No puedo encontrar la forma de hacerlo con .htaccess.

Como siempre mil gracias.

Saludos
  #6 (permalink)  
Antiguo 26/01/2012, 11:56
Avatar de emprear
Colaborador
 
Fecha de Ingreso: junio-2007
Ubicación: me mudé
Mensajes: 8.388
Antigüedad: 16 años, 9 meses
Puntos: 1567
Respuesta: Regla para una condición, pero no para otra, en .htaccess

@Jamati
Te aclaro que todo esto es más fácil hacerlo que explicarlo, y no vayas a creer que se tanto.

Mientras aqui el . (punto) representa cualquier caracter
(.*)
en la segunda
([a-zA-Z0-9]*)
estas limitando a un rango de caracteres, comprendido entra la a y z (minúsculas mayúsculas, y cuidado que corresponde al alfabeto en inglés, por ejemplo,ñ Ñ no cuentan)y los digitos del 0 al 9
El segundo ya es más complicado, y tampoco sé muy bien que es lo que querés lograr. Pero voy a insistir con el concepto,
Qué es una url amigable?
Basicamente una url que enmascara parámetros y parámetros pasados por get. Para que la molesta
catalogo.php?marca=ford&modelo=escort
se convierta en la más atractiva
/ford/escort
ó incluso en
catalogos_automoviles/ford/escort

Ahora ,eso que es bastante simple de hacer, se complica cuando lo queres combinar con cosas (y presumo que esa es tu intención) como esa estructura de carpetas y subcarpetas que analizamos en los posts previos.
viendo
RewriteRule ^(.*)/(.*)_id([0-9]*)\.php$ articulos/articulo.php?id=$3 [NC,L]
y tomando en cuanta que cada expresion entre () es una variable que se pasa, me pregunto que representan las dos primeras (.*)/(.*), o por que usar[0-9] en la tercera cuando bien podés hacer que articulos.php filtre ese valor y compruebe si es o no un numero, ni siquiera creo que sea necesario llamar con la extension php.

y en tus ejemplos?
que son car1/car2 carpeta1 carpeta2... carpetas reales, o prefijos que le pones a la cadena para hacerla más descriptiva?
Como ves, hasta a mi se me complica al no estár delante de todo tu código y ver el funcionamiento completo de tu aplicación

Saludos
__________________
La voz de las antenas va, sustituyendo a Dios.
Cuando finalice la mutación, nueva edad media habrá
S.R.

Etiquetas: condición, htaccess, regla, rewrite, url
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 20:32.