Ver Mensaje Individual
  #3 (permalink)  
Antiguo 22/07/2014, 12:09
efren315
 
Fecha de Ingreso: septiembre-2013
Mensajes: 32
Antigüedad: 13 años
Puntos: 0
Respuesta: url amigable con redireccion

Cita:
Iniciado por epinaresg Ver Mensaje
Para poder lograr la funcionalidad que mencionas deberás de trabajar con url's amigables con htaccess.

Archivo ".htaccess"
Código PHP:

RewriteEngine on

RewriteCond 
%{REQUEST_FILENAME} !-f
RewriteCond 
%{REQUEST_FILENAME} !-d
RewriteRule 
.* index.php?enlace=$0 [PT,L] 
Este archivo deberá estar en la raíz del proyecto y funcionaria de la siguiente manera:

Como lo ingresarías en tu browser
http://www.miweb.com/enlace1

Como lo interpreta el servidor
http://www.miweb.com/index.php?enlace=/enlace1

con lo cual con un simple $_GET['enlace'] podrás obtener el parametro que pasas por la url.

Para captura el enlace y luego redireccionarlo lo podríamos hacer de la siguiente manera.

Recomendaria que al momento de registrar un nuevo anuncio generaras y almacenaras la url en la base de datos, ademas de validar que sea unica.

Archivo "index.php"
Código PHP:

<?php

if (isset($_GET['enlace']) && !empty($_GET['enlace'])) {

    
$enlaces_string = trim(str_replace('/', ' ', $_GET['enlace']));

    
$enlaces_array = explode(' ', $enlaces_string);

    
$enlace = $enlaces_array[0];


    
$actual_url = 'http://' . $_SERVER['HTTP_HOST'] . '/';


    
$registros = array(
        array(
            
'enlace' => 'enlace1',
            
'titulo' => 'este es el enlace 1',
            
'url_amigable' => urls_amigables('este es el enlace 1') . '.html'
        
),
        array(
            
'enlace' => 'enlace2',
            
'titulo' => 'este es el enlace 2',
            
'url_amigable' => urls_amigables('este es el enlace 2') . '.html'
        
)
    );

    
$data_a_mostrar = array();

    for (
$i = 0; $i < count($registros); $i++) {


        if (
$registros[$i]['url_amigable'] === $enlace)
            
$data_a_mostrar = $registros[$i];

        if (
$registros[$i]['enlace'] === $enlace)
            
header('Location: ' . $registros[$i]['url_amigable']);
    }


    if (!empty(
$data_a_mostrar)) {

        echo 
'<pre>';
        
print_r($data_a_mostrar);
        echo 
'</pre>';
    } else {
        echo 
'ERROR 404';
    }
}

function 
urls_amigables($url) {
    
$url = strtolower($url);
    
$find = array('á', 'é', 'í', 'ó', 'ú', 'ñ');
    
$repl = array('a', 'e', 'i', 'o', 'u', 'n');
    
$url = str_replace($find, $repl, $url);
    
$find = array(' ', '&', '\r\n', '\n', '+');
    
$url = str_replace($find, '-', $url);
    
$find = array('/[^a-z0-9\-<>]/', '/[\-]+/', '/<[^>]*>/');
    
$repl = array('', '-', '');
    
$url = preg_replace($find, $repl, $url);
    return 
$url;
}
Con este codigo capturo el parametro "/enlace1" de la url "http://www.miweb.com/enlace1", luego lo limpio y hago una busqueda en un arreglo de datos ( en tu caso seria una consulta a la base de datos en base al enlace capturado de la url ).

Obtienes la url amigable de la base de datos, armas y redireccionas a la nueva url que seria "http://www.miweb.com/este-es-el-enlace-1.html", donde este enlace funcionaria de la misma manera. Capturas el parámetro que en este caso seria "/este-es-el-enlace-1.html", lo limpias y lo buscas en la base de datos.

Si existe se mostrara la información del anuncio, caso contrario mostrar un error 404.

Saludos

Hola amigo gracias por responder ya aplique tu ejemplo y todo va bien como tu lo colocastes pero al momento de colocar la variable que contiene el titulo me tira el error 404. y no entiendo el xq?

tengo lo siguiente
Código PHP:
<?php
$elenlace
=$_GET['enlace'];
require(
'config.php');
$tabla = mysql_query("SELECT * FROM tb_pre_ads WHERE link='$elenlace'");
mysql_close($con);
while (
$registro = mysql_fetch_array($tabla)) {
$link=$registro['link']; // obtengo el enlace del anuncio
$titulo=$registro['titulo'];// obtengo el titulo del anuncio
}

if (isset(
$_GET['enlace']) && !empty($_GET['enlace'])) { 

    
$enlaces_string = trim(str_replace('/', ' ', $_GET['enlace'])); 

    
$enlaces_array = explode(' ', $enlaces_string); 

    
$enlace = $enlaces_array[0]; 


    
$actual_url = 'http://' . $_SERVER['HTTP_HOST'] . '/'; 


    
$registros = array( 
        array( 
            
'enlace' => ''.$link.'', 
            
'titulo' => ''.$titulo.'', 
            
'url_amigable' => urls_amigables(''.$titulo.'') . '.html'  // en esta parte si coloco la variable '$titulo' la url se muestra correctamente www.misitioweb.com/y el titulo.html pero me imprime el error 404 y no me carga el contenido
        
), 
        array( 
            
'enlace' => 'enlace2', 
            
'titulo' => 'este es el enlace 2', 
            
'url_amigable' => urls_amigables('este es el enlace 2') . '.html' 
        
) 
    ); 

    
$data_a_mostrar = array(); 

    for (
$i = 0; $i < count($registros); $i++) { 


        if (
$registros[$i]['url_amigable'] === $enlace) 
            
$data_a_mostrar = $registros[$i]; 

        if (
$registros[$i]['enlace'] === $enlace) 
            
header('Location: ' . $registros[$i]['url_amigable']); 
    } 


    if (!empty(
$data_a_mostrar)) { 

        echo 
'<pre>'; 
        
print_r($data_a_mostrar); 
        echo 
'</pre>'; 
    } else { 
        echo 
'ERROR 404'; 
    } 
} 

function 
urls_amigables($url) { 
    
$url = strtolower($url); 
    
$find = array('á', 'é', 'í', 'ó', 'ú', 'ñ'); 
    
$repl = array('a', 'e', 'i', 'o', 'u', 'n'); 
    
$url = str_replace($find, $repl, $url); 
    
$find = array(' ', '&', '\r\n', '\n', '+'); 
    
$url = str_replace($find, '-', $url); 
    
$find = array('/[^a-z0-9\-<>]/', '/[\-]+/', '/<[^>]*>/'); 
    
$repl = array('', '-', ''); 
    
$url = preg_replace($find, $repl, $url); 
    return 
$url; 
}
Como ves no se por que sera em ayudas alli xfa, ya que si llamo al enlace2 si me imprime el array pero si llamo con el link el url si cambia pero me tira el error 404 y no se el xq.