.htaccess, url amigables y expresiones regulares

FaLLeN

Hola mediavideros!

Veréis, estoy intentando hacer unas url amigables para una página web y si bien consigo pasar las url normales, no consigo pasar las que llevan más elementos.

Es decir; si puedo redirigir mi_sitio.com/index.php?variable=URL a /mi_sitio/url/, pero si la url es mi_sitio.com/index.php?variable=URL URL (véase que hay un espacio y otro elemento más) sólamente me coje la primera parte.

¿Controláis las expresiones regulares? Imagino que la solución estará en qué poner detrás de $1 en el htaccess.

Espero vuestra ayuda.

EnZo

Se supone que la URL tiene un espacio? O son dos url? No sé a que te refieres con otro elemento más.

Podriías poner un ejemplo real?

1 respuesta
egrojcire

Ya que estás te recomiendo que la url cambie con "mi_sitio.com" a "www.mi_sitio.com", para mejor el posicionamiento y eso ;) con el tema de las url amigables, estás usando algún cms? o_0? o es todo a mano?

eXtreM3

#2 Se refiere a que la variable puede ser MESA ROJA, por ejemplo.

1 respuesta
EnZo

#4 Pero es como si lo que quisiese fuese al contrario. "Es decir; si puedo redirigir mi_sitio.com/index.php?variable=URL a /mi_sitio/url/"

Deberia querer: mi_sitio.com/URL URL/ -> mi_sitio.com/index.php?variable=URL URL
no?

1 respuesta
FaLLeN

#5 El tema es el siguiente:

tengo una url: www.misitio.com/index.php?="VARIABLE" -> El caso es que VARIABLE en algunos casos es compuesta, es decir: VARIABLE = "Palabra1 Palabra2"

La redirección sería: www.misitio.com/VARIABLE/

solo que en algunos casos sería asi: www.misitio.com/Palabra1 Palabra2/

1 respuesta
EnZo

Suponiendo que todas las variables que quieras pasar sean letras:
RewriteRule [A-Za-z ]+/?$ index.php?nombrevar=$1

Tienes mod_rewrite activado en apache?

1 respuesta
eXtreM3

#6 entonces yo lo arreglaría más con programación antes de redireccionar, me explico:

  • Conoces el nombre de la variable, que puede ser de una palabra o de varias.
  • Hay que pasarle una función que elimine todos los espacios intermedios, tal que:
function limpia_espacios($cadena){
		$cadena = str_replace(' ', '', $cadena);
		return $cadena;
	}
  • Te devolverá, en tu ejemplo: Palabra1Palabra2

Y ya podrás hacer lo típico, redireccionar a /url cuando tengas variable=$1, no?

EDIT: como dato adicional, decir que el espacio en blanco en las urls se representa con -> %20

1 respuesta
FaLLeN

#7 Si lo tengo activado.

Ahora mismo lo que tengo puesto es:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule [a-zA-Z0-9_-]+$ index.php?variable=$1

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule [a-zA-Z0-9_-]+/$ index.php?variable=$1

#8 Eso si lo uso para unas cosas, pero el tema es que la URL tiene que contener el espacio para un tema en especial.

2 respuestas
EnZo

#9 Añade el caracter espacio a tu expresion. [a-zA-Z0-9 _-]
Y escapa el guion porque es un caracter especial. Aunque creo que para este caso no te hace falta.

1 respuesta
eXtreM3

#9 mira la idea del guión lo veo mejor, además tiene más sentido concatenerlo en la url.

Puedes pasarle la función que te he puesto en #8 pero en vez de '' le pones '-' , así te dejará una url tal que: tuweb.com/palabra1-palabra2

Entiendo que luego querrás hacer consultas en la web destino según la url que tengas en $_GET, pero bastará con que le pases la función explode a esa variable y cojas ambas partes ^^

A priori tiene más sentido, ya que una url con un espacio, al ponerla en el navegador automáticamente te lo sustituye por un %20 y queda super feo, sin hablar de temas como posicionamiento y blabla.

1 respuesta
FaLLeN

#10 \ Ese símbolo es el equivalente al espacio? Tal cual lo pongo, sigue sin hacerme la redirección.

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule [a-zA-Z0-9_-]+$ index.php?variable=$1

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule [a-zA-Z0-9_-]+/$ index.php?variable=$1

#11 imagino que si que tendré que hacer eso por el tema del posicionamiento!

1 respuesta
EnZo

#12 Te lo he pasao sin probarlo, y no me acordaba que en el mod_rewrite hay que escapar los espacios para los rangos. El caracter \ sirve para escapar. Para que el caracter que pongas delante lo ponga como tal. aunque sea un caracter especial. Por ejemplo tu estas usando el caracter [ para hacer el rango pero si quieres usarlo dentro de tu listado tendras que ponerle el \ delante para que lo interprete como caracter real no como caracter de la expresion regular: [0-9[A-Z]

Usa esto tal cual:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule [A-Za-z0-9\ _-]+/?$ index.php?variable=$1

Pero no la repitas para poner el / al final del todo. Porque si a tu / le pones el caracter ? le estas diciendo que es opcional.

1 respuesta
FaLLeN

#13 Perfectísimamente perfecto! Muchas gracias, te debo una cerveza en el celeste!

2 respuestas
EnZo

#14 Cuando dices celeste te refieres a algo metaforico? O te refieres al pub celeste de aqui de Molina al que amenudo voy a tomarme una cerveza? me has dejao loco xD

De nada :P

1 respuesta
FaLLeN

#15 Me refiero efectivamente al pub de Molina donde vas. Soy el Josemi, amigo del monchi

EnZo

Hostia puta xD Ahora me cuadra todo... xD No sabia que eras tú. Ademas en el lol te tengo agregao y tienes otro nick.

Ademas hace poco te envie un privado para que me dijeras como se llamaba el video de adivina lo que es. Y yo sin saber que eras tu... O_o

Entonces si! Me debes una cerve :P

eXtreM3

#14 Cómo te queda la url con las 2 palabras después de la reescritura? Sólo por curiosidad :P

1 respuesta
FaLLeN

#18 Pues queda bastante bien. Quieres ver el enlace real?

1 respuesta
eXtreM3

#19

iAtlas

Se me hace raro no usar \s para representar un espacio :S

FaLLeN

www.lolguideindexer.com/Dr Mundo/

Entiendo los problemas que puede causar, pero bueno, ya me plantearé otra cosa más adelante

1 respuesta
EnZo

#22 Mi recomendacion es que en el listado de enlaces pongas los nombres con guiones porque google te indexará mejor.
Y tambíen dejaría la opcion de que la gente pueda escribirlo con espacios escribiendo.

Para que alguien que escriba simplemente lolguideindexer.com/Dr Mundo le aparezca la web. Eso sí, redireccionando a la correcta, osea con guion.

1 respuesta
FaLLeN

#23 Si, voy a tener que cambiarlo. Son solo 3 urls las que hay asi, pero bueno, asi ya lo tengo todo más "ordenadico"

1 año después
N1Tr0s

Buenas, aprovecho que éste hilo está creado para exponer mi duda, (si hago mal decidmelo y abro uno nuevo).

En mi web estoy usando url amigables y tengo el siguiente caso:
-En la carpeta raiz tengo una pagina que se llama catalogo.html
-En la carpeta raiz tengo una carpeta que se llama "catalogo", con otras paginas dentro (pera.html, platano-de-canarias.html por ejepmlo)

Cuando quiero abrir la pagina "catalogo", me muestra el explorador de la carpeta catalogo (y obviamente quiero ver la pagina catalogo.html),
¿cómo puedo evitar esta situación?

mi htaccess es el siguiente:

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

#25 abre uno nuevo!

charl1

Realmente el ser humano es extraordinario, sin acritud ni mala fe ni lo que os ocurra, porque os complicáis tanto la vida? Está bien aprender el \ para expresiones regulares y como usarlo, pero desde que programo en la vida he usado espacios por los problemas que conlleva.

Es algo personal, pero para mi, var1 var2 = var1Var2

Al menos todo ha llegado a buen puerto.

10 meses después
FaLLeN

Refloto el hilo ya que vuelvo con el tema de las expresiones regulares.

Quiero hacer que analytics me pille la URL que me devuelme mi CMS (woocommerce) desde paypal.

He mirado tutoriales que ponen una expresión regular por defecto, pero esa no se ajusta a mi estructura.

Esta es la expresión regular que ponen de ejemplo:

/?order=.{1,}&key=order_(.)

Para una URL tal que así:

yourdomain.com.au/checkout/order-received/?order=84&key=order_52db1b3099b98&utm_nooverride=1

Mi estructura es diferente:

tubarba.com/finalizar-comprar/order-received/1091?key=wc_order_53ea43a471335&utm_nooverride=1

siendo las negritas las partes variables.

Podríais orientarme a cómo sería en este caso la expresión regular que debería hacer?

Usuarios habituales

  • FaLLeN
  • charl1
  • elkaoD
  • EnZo
  • iAtlas
  • eXtreM3
  • egrojcire