[mod_rewrite] una variable GET se pierde :S !

Iniciado por Diabliyo, 15 Noviembre 2011, 02:28 AM

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

Diabliyo

Buenas.

Pues uso mod_rewrite para evitar formar las URLs complicadas (index.php?algo=valor) y pues se hace mas amigable (sitio.com/dato). No me metere en explicarlo ya que asumo que saben que es.

Mi problema se basa en que una variable que estoy pasando no me la manda, vaya estas son las reglas que tengo:

Options +FollowSymLinks
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteEngine on
# raiz
RewriteBase /
# ver noticia
RewriteRule ^hoja/(.+)\-(.+)\.html$ index.php?hoja=$1
# login - conectar
RewriteRule ^log/in$ index.php?log=entrar
# logout - desconectar
RewriteRule ^log/out$ index.php?log=salir
# log - error
RewriteRule ^log/error$ index.php?log=error
# log dos - detecto intento de bruteforcing
RewriteRule ^log/dos_prev$ index.php?log=brute

# ver contenido de un menu
RewriteRule ^(.+)/$ index.php?ver=$1
# ver contenido de una sección
RewriteRule ^(.+)/(.+)/$ index.php?ver=$1&sec=$2


La ultimoa regla RewriteRule ^(.+)/(.+)/$ index.php?ver=$1&sec=$2 es la de ver contenido de una sección, en si, la variable ver no le pasa :(...

De esta forma armo el link:

<a href="misitio.com/auto/ford/">sección</a>

Haciendo un print_r($_GET), al dar clic sobre la sección, veo esto:

Array ( [ver] => index.php [sec] => ford )

Se supone que en la variable $_GET["ver"] debe estar el valor de auto. Pero mete el valor index.php.

Alguna idea ?, ya ando cansado y frustrado, mi mente no da mas :D, he pasado todo el dia viendo el htaccess, el codigo y no encuentro problema :S....

Saludos !

s00rk

Al poner (.+) estas diciendo que incluya todo lo demas por lo que incluye los "/", para esto puedes mejor usar expresiones regulares o usar \w+
prueva cambiandlo asi:

RewriteRule ^(\w+)/(\w+)/$ index.php?ver=$1&sec=$2

en este :
# ver contenido de un menu
RewriteRule ^(.+)/$ index.php?ver=$1

No da error porque solo ocupamos un elemento asi que puede obtener todos a la vez, pero recomendaria igual cambiarlo por lo anterior dicho o usar expresiones regulares para irse acostumbrando jeje

el poner .+ o .* , quire decir incluir todo no importa que signo sea en este caso / , que eso si no devemos pasar por lo que ocupamos que sean solo letras.

Por lo menos esto a mi me funciono n_n*!

Suerte.

Diabliyo

#2
Cita de: s00rk en 15 Noviembre 2011, 03:08 AMen este :
# ver contenido de un menu
RewriteRule ^(.+)/$ index.php?ver=$1

No da error porque solo ocupamos un elemento asi que puede obtener todos a la vez, pero recomendaria igual cambiarlo por lo anterior dicho o usar expresiones regulares para irse acostumbrando jeje

No le veo logica, ya que si pongo "mitisio.com/menu_01/", entonces la variable guardaria el valor de menu_01/, y no es asi, guarda solamente menu_01.

Cita de: s00rk en 15 Noviembre 2011, 03:08 AM
Al poner (.+) estas diciendo que incluya todo lo demas por lo que incluye los "/", para esto puedes mejor usar expresiones regulares o usar \w+
prueva cambiandlo asi:

RewriteRule ^(\w+)/(\w+)/$ index.php?ver=$1&sec=$2

en este :
# ver contenido de un menu
RewriteRule ^(.+)/$ index.php?ver=$1

No da error porque solo ocupamos un elemento asi que puede obtener todos a la vez, pero recomendaria igual cambiarlo por lo anterior dicho o usar expresiones regulares para irse acostumbrando jeje

el poner .+ o .* , quire decir incluir todo no importa que signo sea en este caso / , que eso si no devemos pasar por lo que ocupamos que sean solo letras.

Por lo menos esto a mi me funciono n_n*!

Suerte.

Pues no funciona, he cambiado las cosas y deje asi:

RewriteRule ^hoja/(.+)\-(.+)\.html$ index.php?hoja=$1
RewriteRule ^(.+)/page/(.+)$ index.php?ver=$1&page=$2
RewriteRule ^log/in$ index.php?log=entrar
RewriteRule ^log/out$ index.php?log=salir
RewriteRule ^log/error$ index.php?log=error
RewriteRule ^log/dos_prev$ index.php?log=brute

# profundidad de mas niveles
RewriteRule ^(.+)/$ index.php?ver=$1
RewriteRule ^(\w+)/(\w+)/$ index.php?ver=$1&sec=$2


Y ahora me da esto el print_r($_GET):

Array ( [ver] => nuestra_flota/ford )

Ya ni toma la variable "sec" y resulto contrario, incluyo todo sin importar el /, no lo tomo como delimitador :S.

Saludos !

Diabliyo

Como solucion estoy haciendo un cambio a la regla actual dejandola al final con la extensión html:

# antes
RewriteRule ^(.+)/(.+)/$ index.php?ver=$1&sec=$2

# despues
RewriteRule ^(.+)/(.+)\.html$ index.php?ver=$1&sec=$2


Y ahora verl el print_r($_GET);, y veo:

Array ( [ver] => nuestra_flota [sec] => ford )

Hasta aqui vamos bien....

Pero ahora surgio un segundo conflicto :(.... existe otra regla esta:

# muestra contenido de una sección o menu
RewriteRule ^hoja/(.+)\-(.+)\.html$ index.php?hoja=$1


Que no se interpreta debido a la regla que habia puesto, es obvia la razon, pero no se me ocurre una solucion inteligente :S :(....

Saludos !

~ Yoya ~

Te recomiendo que dividas todo. Osea puede que el problema este con la regex y pienses que es con la configuración del modrewrite o viceversa.

Prueba testeando la regex, puedes usar esta herramienta online RegexTool, creo que no tendrás problema con la compatibilidad entre las regex, utilizan el mismo motor de expresiones regulares.

Saludos.
Mi madre me dijo que estoy destinado a ser pobre toda la vida.
Engineering is the art of balancing the benefits and drawbacks of any approach.