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($res, MYSQL_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;
}
?>
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";
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:
y otra duda que es la que me tiene mas ocupada, desde el index pongo las noticias, opiniones, eventos etc. mas destacados# 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 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:
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:# 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]
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