Ver Mensaje Individual
  #1 (permalink)  
Antiguo 20/03/2012, 18:38
Avatar de catpaw
catpaw
 
Fecha de Ingreso: mayo-2010
Ubicación: xalapa
Mensajes: 856
Antigüedad: 14 años
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