Wednesday, November 5, 2008

Apache: RewriteRule a una url con caracteres especiales como pe.e %

Se trata de algo muy específico, tanto que te lleva un rato ingeniartelas para que funcione.

Contexto:
Se trata de redirigir el tráfico que entra a una url a una página index.php que recibe como parámetros otra página php con unos parámetros propios. Esta técnica se usa por ejemplo cuando queremos indicarle a la página inicial qué otras páginas debe cargar en cada uno de los frames definidos, en función p.e. del idioma.

index.php?url1=./body/index.php%3Flang%3Des&n=2&m=no

donde %3F es igual a '?'
y %3D es igual a '='

pero no podemos escribirlos tal cual ya que si no php los interpretaría y se volvería un poco loco.

index.php recibe 3 argumentos:
  1. url1=./body/index.php%3Flang%3Des
  2. n=2
  3. m=no
Solución:
RewriteRule /$ http://server2.dom.com/index.php?url1=./body/index.php\%3Flang\%3Des&n=2&m=no [L,R,NE]

Lo que está en negrita es el meollo del asunto.

Falsas soluciones:
RewriteRule /$ http://server2.dom.com/index.php?url1=./body/index.php\%3Flang\%3Des&n=2&m=no [L,R]

redirige a :
http://server2.dom.com/index.php?url1=./body/index.php%253Flang%253Des&n=2&m=no

RewriteRule /$ http://server2.dom.com/index.php?url1=./body/index.php%3Flang%3Des&n=2&m=no [L,R]

redirige a:
http://server2.dom.com/index.php?url1=./body/index.phpFlangDes&n=2&m=no



Bueno, no digo que sea algo que uno deba saber, pero sí algo que recordar vagamente para saber orientarnos.


Buenas noches.

2 comments:

Profeta said...

Está muy bien, pero para redirigir TODO el tráfico; y si quieres redirigir sólo algunos hosts?
Deberías darles una regla especial?
Deberías definir las excepciones 1 by 1?
Definir un sólo proxy y hacer pasar por ahí a los "elegidos"?

Paco McCloud said...

Al primero que me diga que seguir la historia de la saga "Crisis en Tierras Infinitas" es complicado es que no os ha leído a ninguno de los dos...