URL Amigable

Kaos

Quiero agregar URLS amigables a www.tammystyle.net en las noticias.

Los enlaces son del tipo:
http://www.tammystyle.net/index.php?idn=403

Tengo el httaccess tal que así:
Options +FollowSymLinks
RewriteEngine on
Rewriterule .*$ index.php?idn=$1&title=$2

Para que funcione al pasarle un enlace del tipo:
http://www.tammystyle.net/".$idn."/".urls_amigables($url)."/";

Lo segundo es una función que me pasa cualquier texto a un formato compatible URL.

El tema q al activar toda la morralla esta se dejan de mostrar noticias y las fotos, es decir, todo lo q son URL's parece q cambian. He probado a dejarlas completas, tipo:

http://www.tammystyle.net/imagenes/logo.gif (por ejemplo para el logo)
Pero ni aun así...

Alguna recomendación?

Survivor

Hola Kaos,

Te paso un htaccess que hice para un caso similar

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule articulo/([a-zA-Z0-9]+)/([a-zA-Z0-9-]+)$ index.php?go=news&id=$1&title=$2 [L,NC]
</IfModule>

lo que hace es desde el directorio raiz por ejemplo : http://www.tammystyle.net/ añade

http://www.tammystyle.net/articulo/12/titulo-de-la-noticia

donde 12 es la id de la noticia y despues ya esta el titulo sin espacios , comas o similares pero vamos eso ya lo tendras

El error que veo que tienes es que tu con esto :

Rewriterule .*$ index.php?idn=$1&title=$2

sobreescribes todas las urls que haya despues de tu dominio.

Espero que te sirva ;)

Un saludo

1
Kaos

Me ha venido eso de arte survivor. De momento ya no tengo el problema de antes. Eso si, he tenido q poner todas las imagenes y rutas absolutas, no sé si habrá forma de hacerlo de otra manera pero bueno de momento eso me solventa y aparecen todas como deben.

Ahora mi duda es la siguiente, teniendo una URL Amigable, me olvido del GET verdad?
Ahora debería hacer un explode de la URL para coger la ID no?

Muchas gracias!

EDITADO: Bueno probando he visto q el GET si q lo coge, lo único q el error me lo seguía dando pq tomaba como GET el ID y el Título. Le he hecho un explode al "/" y santas pascuas... Supongo q habrá otras formas para q el ID solo te salga el numero y el titulo te venga por otro GET... Pero bueno tampoco es algo grave, total, siempre va a ser ID+Titulo.

Editado 2: Por cierto de q va el RewriteBase / ¿? he visto un centenar de tutoriales y en ninguno lo he visto :O, voy a googlear

SeiYa

A ver, las imágenes no se ven porque tu tendrás la carpeta de imágenes alojada en: tuweb.com/imagenes y te referencias a ellas como "imagenes/imagen.gif" mientras que si estás accediendo con el .htaccess, estaría buscando en articulos/imagenes/imagen.gif y por eso no la encuentra.

Por otra parte, el get funciona siempre igual, no necesitas hacer nada. ¿El título para qué necesitas recogerle? ¿No haces la SQL únicamente con la $id que pasas? creo que el título te sobra y no le necesitas para nada, al menos a la hora de trabajar con el, es cierto que le necesitas para construir la url amigable.

Survivor

#3 lo del RewriteBase / es para modificar las urls a partir del directorio raiz , es decir, que si tu web la tienes en una carpeta que se llama por ejemplo web para que funcione el htaccess tendrias que cambiar el RewriteBase / a RewriteBase /web . De modo que para ver los articulos como antes tendrias la url de :

http://www.tammystyle.net/articulo/12/lo-que-sea

a :

http://www.tammystyle.net/web/articulo/12/lo-que-sea

Es muy útil tenerlo por si tienes un alojamiento compartido con varios dominios o simplemente si tienes varias aplicaciones que no quieres que cuelguen del directorio raiz

#4 Supongo que el poner el titulo es por tema de SEO para que si hacen busquedas desde google pueda aparecer la página

SeiYa

#5 me refiero a que en:

articulo/([a-zA-Z0-9]+)/([a-zA-Z0-9-]+)$ index.php?go=news&id=$1&title=$2 [L,NC]
</IfModule>

A &title le envia el título amigable, que no creo que sea necesario.

Yo en mi web personal si que envio el título amigable pero de hecho, es lo único que envío, ya que cambié las noticias y las añadí un campo "titulo_amigable" único para cada noticia para buscar por ahí en lugar de por la id, de ese modo no tengo que poner la id en el enlace que es algo que me parece feucho XD

EDIT: ejemplo: http://www.tammystyle.net/estetica/395/soy-una-rumberaaaaaa-me-gustan-las-pollaaaaas solo utiliza la id, por eso quiero decir, que si, que el título le mete en los links (en el href) para que lo indexe google pero porqué lo mete después en el index.php?go=news&id=$1&title=$2 <--- (el $2) eso es lo que no entiendo :P

1 mes después
Josepanaero

Me pasa exactamente lo mismo que a #3. ¿Alguien sabe alguna solución para hacer eso elegantemente (es decir, sin tener que poner las rutas absolutas)?

Es que por ejemplo, antes de trastear con el mod_rewrite, yo tenía organizada así mi web:

css/estilo.css
img/imagen1.jpg
img/imagen2.jpg
index.php
contacto.php

Entonces antes de cacharrear con mod_rewrite, todo iba bien, pero las urls eran de este estilo:
miweb.com
miweb.com/contacto.php

Y todo funcionaba bien. Pero ahora es cuando me da por pasarme a las URLS amigables, añadiendo esto al .htaccess:
RewriteEngine on
RewriteRule contacto/ ./contacto.php

Entonces si ahora pongo, por ejemplo:
miweb.com/contacto/

Me sale, evidentemente, la web sin aplicar ningún estilo y sin imágenes, porque cuando quiere ver por ejemplo dónde está el css, lo que tengo puesto es esto:
<link rel="stylesheet" type="text/css" href="css/estilo.css" />

E intenta mirar en:
miweb.com/contacto/css/estilo.css

Lo cual no existe. De igual modo sucede con las imágenes. Una solución sería cambiar el href por una dirección absoluta, pero a mi modo de ver es una solución cutre. Tiene que haber alguna otra opción para hacer esto elegantemente.

¿Alguien podría explicar cómo?

Un saludo!

EDIT: ¡¡¡SOLUCIONADO!!!

Joder, menuda tontería... Era simplemente añadiendo dentro de <head></head> la siguiente etiqueta:
<base href="http://miweb.com/" />

Saludos!

1 año después
eXtreM3
+info

Tengo unas dudas respecto a las urls amigables en php:

Por ejemplo, tengo el siguiente enlace http://miweb.com/tienda.php?id=300 , sé que podría ponerlo de la siguiente manera http://miweb.com/300 , pero quiero rizar un poco el rizo, y crear algo al estilo "facebook" o cosas similares que pasan el nombre por url.

Es decir, a la hora de crear el vínculo, podría generar esto: http://miweb.com/tienda.php?id=300&nombre=Zapateria-Manuela, entonces mi pregunta es, podría generar la siguiente url?

http://miweb.com/zapateria-manuela ó http://miweb.com/zapateria+manuela

De ser así, cómo se hace? Estoy muy muy pegado con el mod_rewrite y expresiones regulares (no he usado nunca antes ninguna de las dos cosas)

Graciasssss!!

edit: añado el dato de que "id" es la clave primaria de la tabla tiendas, y "nombre" es un campo varchar normal, no es único, así que puede repetirse.

G

#8

Puedes tomar como ejemplo cómo gestiona wordpress las URL amigables.

Para hacer lo que quieres hacer, deberías guardar en la base de datos un campo con un identificador textual.

Por ejemplo en http://miweb.com/zapateria-manuela deberías guardar, en la misma entrada un campo que sea "zapateria-manuela". De esta forma en vez de buscar por ID, buscas por esta id textual. La ID pasa de ser un número, a una cadena de texto.

Pero ojo! Esto te obliga a tener cuidado, puesto que estas utilizando el nombre como identificador, y si tienes dos entradas que se llamen zapateria-manuela, deberás diferenciarlas de alguna forma. Algunos foros o sistemas hechos, añaden la ID detrás del título (zapateria-manuela-300). A efectos de SEO tiene el mismo resultado, pero es menos estético. Depende de tus necesidades.

Un saludo!

eXtreM3

Es verdad #9, es una alternativa viable, gracias!!

Lo de pasar el 300 por url mmmm.. no me hace muxa gracia, como tú dices es menos estético. Lo que haré entonces es que el campo "nombre url" sea único y ya está, asi no hay problema ^^

Como en facebook no? si tú vas a registrar (no tengo facebook, asi q me invento el nombre) un dominio / empresa, para tener la url http://facebook.com/mi-empresa , si llega otro y pone ese nombre le dice que ya está ocupado, que elija otro (o eso tengo entendido)

;)

G

#10, si no prevés tener mas de una zapatería manuela, no tendrás problemas. Y si, es como lo gestiona facebook y todos estos sistemas. Lógicamente no hay otra forma de hacerlo, puesto que a la hora de interpretar una URL sólo hay una forma de hacerlo.

Un saludo!

NeB1

#10 si tienes miedo de repetir url's siempre puedes hacer el truco que también gasta wordpress por defecto de:

www.miweb.com/12/06/2010/zapateria-manuela

Aunque en principio, cuantos menos niveles tenga la url, mejor te puntuará en los buscadores y tal, aunque en la práctica no es apreciable

2 meses después
eXtreM3

Levanto el tema... otra vez :no:

A ver, hasta ahora no me había puesto con lo de las urls amigables, pero ha llegado el momento de hacerlo. Resulta que lo que pretendo hacer es más fácil de lo que había pensando, vereis.

Mi tabla tiendas tiene un campo único que es nombre, y también tiene una id, la cual es clave primaria. Ahora mismo, muestro la información de cada tienda desde la siguiente url: http://miweb.com/tienda.php?id=10 , por ejemplo. Ahora bien, lo que quiero es mostrarla por el nombre, y hacer esa url más amigable, sería pasar de esto:

http://miweb.com/tienda.php?nombre=mediavida

a esto:

http://miweb.com/mediavida

El único objetivo que pretendo es ocultar el nombre del archivo php y el nombre de la variable, es decir hay que eliminar esto -> tienda.php?nombre=

Utilizo Wamp Server, qué debo hacer?

EDITO: ah bueno, se me olvidó comentar que por supuesto existe la posibilidad de todo tipo de nombres de las tiendas: caracteres especiales, tildes, números, espacios... Por si influye en la manera de hacerlo.

Por cierto, antes de hacer esto tengo que tener activado el ModRewrite verdad? Cómo se activa? xD
Si pongo esto en el .htaccess RewriteEngine on me da

error 500

:(

EDIT 2: me cago en la puta, me he tirao toa la puta noche con esto y no he conseguio sacar una mierda, he probado y probado y no me funciona nada ¬¬

A ver ya por lo menos he conseguido que no me de el error 500 ese, buscando el archivo httpd.conf , quitándole la # a esta línea

LoadModule rewrite_module modules/mod_rewrite.so

y cambiando esto

<Directory />
Options FollowSymLinks
AllowOverride All
Order deny,allow
Allow from all
Satisfy all
</Directory>


Ahora cojo el .htaccess y escribo:

Options +FollowSymLinks
RewriteEngine on

Rewriterule tienda/(.*).html$ tienda.php?nombre=$1

(He probado eso y esto)

Options +FollowSymLinks
RewriteEngine on

Rewriterule tienda/nombre/(.*).html$ tienda.php?nombre=$1


Me voy a mi web, y escribo esto:

<a href="tienda.php?nombre=Mediavida">MV</a>

y no hace una mierda, la url se queda igual :mad: :mad: :mad: :mad:

NeB1

#13 que yo sepa, mod rewrite solo funciona con las peticiones, después tienes que reescribir tus scripts para que las url's tengan el formato adecuado.

Lo que deberías probar es a escribir en tu navegador http://tutienda.com/mediavida

Por lo demás... parece que lo estás haciendo bien, has reiniciado apache despues de activar el modulo del rewrite engine?? para comprobarlo haz phpinfo(); y busca loaded modules.

prueba con este código en el rewrite a ver:

RewriteRule tienda/mediavida$ tienda.php?nombre=mediavida

sin tokens ni nada, solo para probar que funciona. (es decir, solo te reescribirá la url de un producto en concreto.

eXtreM3

No me funciona ni con eso, que se supone que es forzarlo para que vaya una url...

Reinicié apache cada vez que hacía un cambio y en el phpinfo me dice que efectivamente el modulo rewrite está activado. No tengo ni idea de esto y seguro que es una tontería :(

PD: por si tiene algo que ver, tengo Windows 7 y la versión del WAMP es la 2.0a

EDIT: estoy leyendo la respuesta de arriba y... no tendré que añadir eso ¬¬ voy a probar

<base href=" http://miweb.com/" />

NeB1

prueba añadiendo

RewriteBase /
o
RewriteBase ./

al principio :S

eXtreM3

LOL, de pura coña me ha salido por la ley de ensayo-error que la url se vea así:

http://miweb.com/tienda/Mediavida

de puta madre... ahora solo me queda quitar tienda/, cuando lo saque posteo el código del htaccess :D

EDIT: me parece que no se puede quitar ese "directorio" ...

.htaccess

Se puede hacer? Juer, se tiene que poder, que los de facebook cambian esto http://www.facebook.com/profile.php?id=12345678 por esto http://www.facebook.com/mv (tu url personalizada, con ese campo único que sería mi nombre). Diosssss estoy hasta los wevos de estoooooo no me saleeeeeeeeeeee xD

LOc0

Puedes quitar tienda como directorio, pero necesitas algún distintivo en el nombre para que modrewrite sepa distinguirlo. Ejemplo: miweb.com/t_nombre

Otra opción es que las URLs que sólo tengan un nivel de profundidad de directorio se intepreten como tiendas. Ejemplo:

http://miweb.com/estoesunatienda

http://miweb.com/estoesundirectorio/yesteelfichero

Para eso la expresión regular que tienes que usar es:

Rewriterule [/]+/?$ tienda.php?nombre=$1

Salu2 ;)

eXtreM3

El problema es que tengo ya varios archivos en el directorio raíz y claro, si pongo eso que me has dicho (Rewriterule [/]+$ tienda.php?nombre=$0) lo interpreta todo igual y falla...

LOc0

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
Rewriterule [/]+/?$ tienda.php?nombre=$1

De esta forma comprueba que el nombre de la tienda no sea ningún fichero ni directorio del raíz antes de traducir nada.

Salu2 ;)

eXtreM3

#20 JOOODDEEEEEEEEERRRRRRRR

QUÉ

PUTO

AMO

ERES

Funcionaaaaaaaaaaaaaaaaaa!!!!!!!!!! :qq: :buitre: :qq: :buitre: :qq:

Muchísisisisiisimas gracias tío, me has sacado de un apuro, pffffffff, realmente estaba ya desquiciado con esto... puuuuuffff.

Así ha quedado finalmente mi .htaccess
NeB1

uno de los más cracks del foro

LOc0

Gracias, en serio, pero tp es para tanto. En este foro hay mucha calidad. Si nos uniéramos la liábamos parda xD...

Salu2 ;)

NeB1

#23 yo opino igual, en mi entorno estoy bastante bien valorado por mis clientes, y aquí me siento tonto xD

eXtreM3

#24 justamente IGUAL xD

Por cierto, no es por hacer publicidad ya que la web no es mía y tal pero, mirad cómo ha quedado finalmente lo del dominio amigable:

Ah, un detalle, al subir el .htaccess al servidor, no funcionaba. Tuve que añadir la línea que me dijo Neb1 de RewriteBase / ;)

BLZKZ

http://tiendeando.com/ver-producto.php?id=27475

no se xD no es del todo amigable :/ creo que podias ponerlo al estilo wordpress cuyas url son muy indicativas xD

si el producto es el resident evil, que ponga en vez de "ver-producto.php?id=27475" algo como "ver-producto/resident-evil" o sin el ver producto :/

NeB1

#26 de hecho, en este post, es una respuesta bastante acertada

eXtreM3

#26 ya ya, sólo lo he hecho para los dominios de las tiendas, que es lo único que me pidieron que fuera amigable. Mañana tengo cita con el cliente, le propondré hacer todas las urls amigables tal y como has dicho, mostrar productos por nombres y demás ;)

EDIT: en el caso del Fallout, sería algo así http://tiendeando.com/27475/fallout o así http://tiendeando.com/27475-fallout

BLZKZ

ok ok, creia que también querias hacer eso :)

No creo que diga que no puesto que mejoraria muchisimo el posicionamiento en google :P suerte con el trabajo

2 meses después
eXtreM3

Y otra vez levanto este tema xD qué pesao

Veamos, es algo totalmente diferente a lo anterior, lo de más arriba está solucionado todo. Igual es una pregunta demasiado noob pero tengo interés.

He desarrollado otra web con urls amigables toda guay, y tengo que subirla a un servidor Windows. Zas en toda la boca!

El mod_rewrite es un modulo de APACHE y mi pregunta es si es compatible con Windows? Funciona el php correctamente, pero no sé si se podrá "instalar" / habilitar el mod_rewrite? Ofús, na más q problemas xD