Foros del Web » Programando para Internet » PHP »

una ayudita con urls amigables (optimizacion)

Estas en el tema de una ayudita con urls amigables (optimizacion) en el foro de PHP en Foros del Web. Que tal maestros yo se que el tema esta muy trillado, de hecho me he leido de todo lo que me ha salido en google ...
  #1 (permalink)  
Antiguo 20/03/2012, 18:38
Avatar de catpaw  
Fecha de Ingreso: mayo-2010
Ubicación: xalapa
Mensajes: 856
Antigüedad: 14 años, 6 meses
Puntos: 23
una ayudita con urls amigables (optimizacion)

Que tal maestros

yo se que el tema esta muy trillado, de hecho me he leido de todo lo que me ha salido en google y gracias a eso ya me funcionan mis url's amigables, lo unico que tengo duda es lo siguiente,

los directorios de mi sitio estan de la siguiente forma:

index.php
.htaccess
................carpeta noticias
.................................noticias.php
.................................ver_noticia.php
................................ .htaccess
...............carpeta opiniones
.................................opinones.php
.................................ver_opinion.php
................................ .htaccess
...............carpeta sociales
.................................sociales.php
.................................ver_evento.php
................................ .htaccess

y así entre otras que están estructuradas igual

para cada una la mecanica es basicamente la misma, por ejemplo

en noticias.php listo todas las noticias de la base de datos y tengo los link de cada una para ver_noticia.php así:

noticias.php

Código PHP:
<?php
$sql_query
="SELECT * FROM noticias";
$res mysql_query($sql_query) or die('Error en la consulta '.mysql_error());
while(
$row=mysql_fetch_array($resMYSQL_ASSOC)){
   
$url $row['titulo_nt'];
?>
<p class="titulo_encabezado"><a href="ver_noticia/<?php echo $id_noticia ?>/<?php echo urls_amigables($url?>.html"><?php echo $row['titulo_nt']; ?></a></p>
<p class="datos_encabezado">Fecha:<b> <?php echo $row['fecha_nt']; ?></b></p>
<p class="datos_encabezado">Lugar:<b> <?php echo $row['lugar_nt']; ?></b></p>
<?php
}
//esta funcion me permite convertir el titulo
//por ejemplo
//titulo: hola amigos como estan 
//a
//titulo: hola-amigos-como-estan
function urls_amigables($url){
    
// Tranformamos todo a minusculas
    
$url strtolower($url);
    
//Rememplazamos caracteres especiales latinos
    
$find = array('á''é''í''ó''ú''ñ');
    
$repl = array('a''e''i''o''u''n');
    
$url str_replace ($find$repl$url);
    
// Añaadimos los guiones
    
$find = array(' ''&''\r\n''\n''+'); 
    
$url str_replace ($find'-'$url);
    
// Eliminamos y Reemplazamos demás caracteres especiales
    
$find = array('/[^a-z0-9\-<>]/''/[\-]+/''/<[^>]*>/');
    
$repl = array('''-''');
    
$url preg_replace ($find$repl$url);
return 
$url;

}
?>
ver_noticia.php

Código PHP:
//tomo la ruta y le quito las barras y guardo en arreglo valores
function getVariables($url){
    
//quitamos la barra del final
    
$url preg_replace('/\/$/'''$url);
     
//separamos las partes/variables de la url y las contamos
    
$variables explode('/'$url);
    
$cantVariables count($variables);
     for(
$c 0$c $cantVariables$c++){
        
//Acumulamos los valores en un arreglo
        
$variables[$c] = limpiar($variables[$c]);
    }
     return 
$variables;
}
function 
limpiar($valor){
    
//permitimos solo letras(a-Z), numeros y guiones
    
return preg_replace('/[^a-zA-Z0-9-_]/'''$valor);
}

$misVariablesGet getVariables($_GET['id_noticia']);
/******************************************************/
$id_noticia=$misVariablesGet[0]; //recupero el unico valor que me interesa
//hago la consulta para desplegar la noticia completa
$sql_query_noticia="Select * from noticias where id_noticia=$id_noticia"
hasta ahi todo ok, pero mi primer cuestionamiento es, la url que me genera es:

http:// www. misitio. com / noticias / ver_noticia / 21 / capturan-al-que-asesino-a-un-hombre-en-la-tranca . html

y me gustaria que se mostrara asi:

http:// www. misitio. com / noticias / ver_noticia / capturan-al-que-asesino-a-un-hombre-en-la-tranca . html

excluir 21 (el id)

la url la armo así desde noticias.php

<a href="ver_noticia/<?php echo $id_noticia ?>/<?php echo urls_amigables($url) ?>.html"><?php echo $row['titulo_nt']; ?></a>

yo se que yo misma la estoy poniendo así, pero como quitarle el id sin dejarlo de pasar a ver_noticia.php para realizar la consulta???

este es mi archivo .htacces (para la carpeta noticias)

Código:
# Agregamos está línea para evitar que se puedan explorar los directorios del
# servidor, en especial si la ubicación física de los archivos se encuentra
# dentro de la estructura del Sitio Web.
Options All -Indexes

# Activar RewriteEngine
Options +FollowSymLinks
RewriteEngine On

# (si lo pongo no funca) RewriteBase /

#Si la url solicitada no es un fichero(existente), continuar... 
RewriteCond %{REQUEST_FILENAME} !-d

#Si la url solicitada no es una carpeta(existente), continuar...
RewriteCond %{REQUEST_FILENAME} !-f
 
Rewriterule ^ver_noticia/(.+) ver_noticia.php?id_noticia=$1&title=$2 [L]
y otra duda que es la que me tiene mas ocupada, desde el index pongo las noticias, opiniones, eventos etc. mas destacados

y desde ahi tambien puedo acceder a ver_noticia o ver_opinion o ver_evento segun sea el caso, solo que las url se arman añadiendo la carpeta correspondiente:

<a href="noticias/ver_noticia/<?php echo $id_noticia ?>/<?php echo urls_amigables($url) ?>.html"></a>

y el .htacces es (para el index)

Código:
# Agregamos está línea para evitar que se puedan explorar los directorios del
# servidor, en especial si la ubicación física de los archivos se encuentra
# dentro de la estructura del Sitio Web.
Options All -Indexes

# Activar RewriteEngine
Options +FollowSymLinks
RewriteEngine On

# (si lo pongo no funca) RewriteBase /

#Si la url solicitada no es un fichero(existente), continuar... 
RewriteCond %{REQUEST_FILENAME} !-d

#Si la url solicitada no es una carpeta(existente), continuar...
RewriteCond %{REQUEST_FILENAME} !-f

RewriteRule ^([^/]*)\.html$ /noticias/ver_noticia.php?id_noticia=$1&title=$2 [L]
pero esta configuracion solo va a funcionar en el caso de la noticia pero si quiero ver la opinion (ojo estamos en el index) no funcionara, habra forma de hacerlo generico algo como:

RewriteRule ^([^/]*)\.html$ /cual_carpeta/ver_que.php?id_depende=$1&title=$2 [L]

donde

cual_carpeta podria ser noticias, opiniones, sociales o otro
que seria dependiendo de la carpeta ver_noticia, ver_opinion, ver_evento
y
depende seria id_noticia, id_opinion o id_evento o id_algun otro

como podria quedar la expresion regular para hacer generico el .htaccess del index???

gracias de antemano

Última edición por catpaw; 20/03/2012 a las 18:47
  #2 (permalink)  
Antiguo 20/03/2012, 20:25
 
Fecha de Ingreso: septiembre-2008
Mensajes: 350
Antigüedad: 16 años, 2 meses
Puntos: 31
Respuesta: una ayudita con urls amigables (optimizacion)

Hola
Estoy un poco hecho bola con lo que explicas
pero con algo como esto:
Código:
RewriteRule ^([A-Za-z0-9-_]+)/([A-Za-z0-9-_]+)\.html/?$ ver_que.php?id_depende=$1&title=$2 [L]
podes poner

Código:
www.dominio.com/ver_noticia/capturan-al-que-asesino-a-un-hombre-en-la-tranca . html
o
www.dominio.com/id_noticia/capturan-al-que-asesino-a-un-hombre-en-la-tranca . html
etc
www.dominio.com/noticia/capturan-al-que-asesino-a-un-hombre-en-la-tranca . htm
l
nota: esto A-Za-z0-9-_ indica que solo esta permitido escribir en la URL
letras, m y M, números guion medio(-) y Guion bajo(_)
si se usa otro como un . etc dará Error 404

y esto: [A-Za-z0-9-_]+)/([A-Za-z0-9-_] indica que solo
podra usar:
Código:
www.dominio.com/noticia/algo.html
si se usa:
Código:
www.dominio.com/noticia/algo/algo.html
dará Error 404
si se quiere usar asi se tiene que agregar otra:
[A-Za-z0-9-_]+)/([A-Za-z0-9-_]+)/([A-Za-z0-9-_]


-
__________________
╬-----╬
║☺₧☻║
╬-----╬
  #3 (permalink)  
Antiguo 21/03/2012, 10:24
Avatar de catpaw  
Fecha de Ingreso: mayo-2010
Ubicación: xalapa
Mensajes: 856
Antigüedad: 14 años, 6 meses
Puntos: 23
Respuesta: una ayudita con urls amigables (optimizacion)

hola gracias por tu respuesta, mira comentaba que tengo este link que armo:

<a href="noticias/ver_noticia/<?php echo $id_noticia ?>/<?php echo urls_amigables($url) ?>.html"></a>

la url que resulta es asi

http://www.dominio.com/noticias/ver_noticia/2/exigen-terminar-obra-en-escuela-de-banderilla.html

lo que no quiero es que aparezca la id, pero si yo hago esto;

<a href="noticias/ver_noticia/<?php echo urls_amigables($url) ?>.html"></a>

ya no recibo la id (porque ya no la mando obvio) y ya no se puede realizar la consulta y me bota error el mysql porque no recibe la id

abra forma de mandar la id sin que aparezca en la url?

Etiquetas: amigables, html, mysql, sql, variables, 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 14:14.