Foros del Web » Programando para Internet » PHP »

imprimir links amigables

Estas en el tema de imprimir links amigables en el foro de PHP en Foros del Web. Buenas, tengo este .htaccess Código: Options +FollowSymlinks RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php?modules=$1 [QSA,L] con el cual si yo pongo ...
  #1 (permalink)  
Antiguo 05/10/2009, 13:54
Avatar de destor77  
Fecha de Ingreso: noviembre-2004
Ubicación: Gálvez, Santa Fe, Argentina
Mensajes: 2.654
Antigüedad: 19 años, 6 meses
Puntos: 43
imprimir links amigables

Buenas,
tengo este .htaccess
Código:
Options +FollowSymlinks
RewriteEngine on
   
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^(.*)$ index.php?modules=$1 [QSA,L]
con el cual si yo pongo en mi navegador
misitio.com/noticias
me lleva a la pagina
misitio.com/index.php?modules=noticias

hasta ahi todo perfecto, pero mi problema (o mejor dicho mi capricho) es que los links html ya salgan "amigables", yo a los links ahora los tengo asi:
Código html:
Ver original
  1. <div id="sidebar">
  2.                     <ul class="sideNav">                           
  3.                         <li><a href="index.php?modules=menu" <? if ($_REQUEST['modules']=="menu"){?>class="active"<?}?>>Menú</a></li>
  4.                         <!--<li><a href="index.php?modules=submenu" <? //if ($_REQUEST['modules']=="submenu"){?>class="active"<? //}?>>SubMenú</a></li>-->
  5.                         <li><a href="index.php?modules=secciones" <? if ($_REQUEST['modules']=="secciones"){?>class="active"<?}?>>Secciones</a></li>
  6.                         <li><a href="index.php?modules=slider" <? if ($_REQUEST['modules']=="slider"){?>class="active"<?}?>>Slider</a></li>
  7.                         <li><a href="index.php?modules=articulos" <? if ($_REQUEST['modules']=="articulos"){?>class="active"<?}?>>Artículos</a></li>
  8.                         <li><a href="index.php?modules=noticias" <? if ($_REQUEST['modules']=="noticias"){?>class="active"<?}?>>Noticias</a></li>
  9.                         <li><a href="index.php?modules=boletin" <? if ($_REQUEST['modules']=="boletin"){?>class="active"<?}?>>Boletín</a></li>
  10.                         <li><a href="index.php?modules=cursos" <? if ($_REQUEST['modules']=="cursos"){?>class="active"<?}?>>Cursos</a></li>
  11.                         <li><a href="index.php?modules=links" <? if ($_REQUEST['modules']=="links"){?>class="active"<?}?>>Links</a></li>                                               
  12.                         <li><a href="index.php?modules=portfolio" <? if ($_REQUEST['modules']=="portfolio"){?>class="active"<?}?>>Portfolio</a></li>
  13.                         <li><a href="index.php?modules=staff" <? if ($_REQUEST['modules']=="staff"){?>class="active"<?}?>>Staff</a></li>
  14.                         <li><a href="index.php?modules=suscripciones" <? if ($_REQUEST['modules']=="suscripciones"){?>class="active"<?}?>>Suscripciones</a></li>                                           
  15.                     </ul>
  16.                     <!-- // .sideNav -->
  17.                 </div>

pero quiero que salgan asi:
Código html:
Ver original
  1. <div id="sidebar">
  2.                     <ul class="sideNav">                           
  3.                         <li><a href="menu" <? if ($_REQUEST['modules']=="menu"){?>class="active"<?}?>>Menú</a></li>
  4.                         <!--<li><a href="submenu" <? //if ($_REQUEST['modules']=="submenu"){?>class="active"<? //}?>>SubMenú</a></li>-->
  5.                         <li><a href="secciones" <? if ($_REQUEST['modules']=="secciones"){?>class="active"<?}?>>Secciones</a></li>
  6.                         <li><a href="slider" <? if ($_REQUEST['modules']=="slider"){?>class="active"<?}?>>Slider</a></li>
  7.                         <li><a href="articulos" <? if ($_REQUEST['modules']=="articulos"){?>class="active"<?}?>>Artículos</a></li>
  8.                         <li><a href="noticias" <? if ($_REQUEST['modules']=="noticias"){?>class="active"<?}?>>Noticias</a></li>
  9.                         <li><a href="boletin" <? if ($_REQUEST['modules']=="boletin"){?>class="active"<?}?>>Boletín</a></li>
  10.                         <li><a href="cursos" <? if ($_REQUEST['modules']=="cursos"){?>class="active"<?}?>>Cursos</a></li>
  11.                         <li><a href="links" <? if ($_REQUEST['modules']=="links"){?>class="active"<?}?>>Links</a></li>                                             
  12.                         <li><a href="portfolio" <? if ($_REQUEST['modules']=="portfolio"){?>class="active"<?}?>>Portfolio</a></li>
  13.                         <li><a href="staff" <? if ($_REQUEST['modules']=="staff"){?>class="active"<?}?>>Staff</a></li>
  14.                         <li><a href="suscripciones" <? if ($_REQUEST['modules']=="suscripciones"){?>class="active"<?}?>>Suscripciones</a></li>                                         
  15.                     </ul>
  16.                     <!-- // .sideNav -->
  17.                 </div>

ya se que esto lo puedo poner a mano (como lo hice recien) pero que pasa si tengo un sitio con 500 link es imposible poner todos a mano, por eso quiero armar una funcion que al pasarle la url en php despues la muestre "amigable" algo como:
Código php:
Ver original
  1. <li><a href="<? echo amigable(index.php?modules=staff);?>" <? if ($_REQUEST['modules']=="staff"){?>class="active"<?}?>>Staff</a></li>

y cuando entre a la pagina me muestre
mitiiso.com/staff


o si yo tengo asi:
Código html:
Ver original
  1. <a class="edit" href="index.php?modules=articulos&amp;opcion=editar&amp;id=<? echo $articulo['id_articulo'];?>" title="Editar Artículo">
  2.                                     Editar
  3.                                 </a>
y pongo asi:
Código html:
Ver original
  1. <a class="edit" href="<? echo amigable('index.php?modules=articulos&amp;opcion=editar&amp;id='.$articulo['id_articulo']');?>" title="Editar Artículo">
  2.                                     Editar
  3.                                 </a>
salga misitio.com/articulos/editar/12

la cuestion es que nose como encarar esta funcion, si alguien ya lo hizo o tiene algun ejemplo por ahi, se lo agradeceria mucho

salu2

Última edición por destor77; 05/10/2009 a las 14:02
  #2 (permalink)  
Antiguo 05/10/2009, 14:18
 
Fecha de Ingreso: septiembre-2009
Mensajes: 124
Antigüedad: 14 años, 7 meses
Puntos: 3
Respuesta: imprimir links amigables

Mmmm, no es muy complicado, a ver si esto te sirve:

<?php

function amigables($key,valor) {

//OBTENGO LA URL DE LA WEB
$host = $_SERVER['HTTP_HOST'].'/';

//SI KEY (KEY DE LA VARIABLE GET) O VALOR (VALOR DE LA VARIABLE GET) NO ES NULO
if($key!="" && $valor!="") {

$url = $host.$valor; //TE QUERDARIA tusitio.com/staff, ya que key seria "modules".

}else {

//SI KEY O VALOR SON NULOS, DEVUELVO LA URL DE LA WEB COMO URL AMIGABLE
$url = $host;

}

//RETORNO LA VARIABLE $url
return $url;

}

?>


Espero que te sirva, si no esta bien explicado o no entendi bien tu consulta, por favor hacemelo saber que continuo ayudandote
  #3 (permalink)  
Antiguo 05/10/2009, 15:09
Avatar de destor77  
Fecha de Ingreso: noviembre-2004
Ubicación: Gálvez, Santa Fe, Argentina
Mensajes: 2.654
Antigüedad: 19 años, 6 meses
Puntos: 43
lo unico que no logro ver es los parametros a pasarle, mi idea es poder pasarle un string que seria la url es decir:
function amigable($url){
....
}

<a href='<? echo amigable('index.php?modules=noticias&amp;opcion=ve r&amp;id='$row['id_noticias']);?>'>Ver noticia</a>

igual me sirve lo que me pasaste para seguir investigando
gracias

bueno lo he logrado por parte jejeje
al final he creado la siguiente funcion:
Código php:
Ver original
  1. function amigables($url){
  2.     $valores=explode('&amp;',$url);
  3.     $ubicacion=explode('/',$_SERVER['PHP_SELF']);
  4.     $modulo=substr($valores[0],strpos($valores[0],'=')+1,strlen($valores[0]));
  5.     $amigable='/'.$modulo;
  6.     for($i=1;$i<count($valores);$i++){
  7.         $amigable.='/'.substr($valores[$i],strpos($valores[$i],'=')+1,strlen($valores[$i]));       
  8.     }
  9.     if($ubicacion[2]=='admin'){
  10.         $amigable='/'.$ubicacion[1].'/'.$ubicacion[2].$amigable;
  11.     }
  12.     else{
  13.         $amigable=$_SERVER['HTTP_HOST'].'/'.$ubicacion[1].$amigable;
  14.     }
  15.    
  16.     return $amigable;
  17. }

entonces cuando ahora pongo:
Código html:
Ver original
  1. <li><a href="<? echo amigables('index.php?modules=articulos');?>" <? if ($_REQUEST['modules']=="articulos"){?>class="active"<?}?>>Artículos</a></li>

me imprime:
Código HTML:
<li><a href="/websa100/admin/articulos" >Artículos</a></li> 
y anda de 10!!!!

El problema que tengo con las url interna de los módulos que tienen parametros

el .htaccess lo cambie a :
Código:
Options +FollowSymlinks
RewriteEngine on
   
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^(.*)$ index.php?modules=$1&opcion=$2&id=$3 [QSA,L]
y los links los armo:
Código html:
Ver original
  1. <h2><a href="<?echo amigables('index.php?modules=articulos&amp;opcion=crear');?>" title="Crear Nuevo SubMenú">Crear</a></h2>
  2.  
  3. <a class="edit" href="<?echo amigables('index.php?modules=articulos&amp;opcion=editar&amp;id='.$articulo['id_articulo']);?>" title="Editar Artículo">

pero no me toma los enlaces

en que le estoy errando, siempre 5 para el peso jajaja

desde ya muchas gracias

Última edición por GatorV; 05/10/2009 a las 21:30
  #4 (permalink)  
Antiguo 05/10/2009, 17:10
 
Fecha de Ingreso: septiembre-2008
Mensajes: 350
Antigüedad: 15 años, 8 meses
Puntos: 31
Respuesta: imprimir links amigables

Hola, dices que tu acoples los tienes así: index.php?modules=secciones
no se si tengas mucho acoples pero si no son muchos con este código para tu file .htaccess puedes usar directamente así: www.sitio.com/mas-de/php/100

sin necesidad de esto: index.php?modules=secciones
este es el código para el: .htaccess

Código:
RewriteEngine on
RewriteBase /
RewriteRule ^([A-Za-z0-9-,]+)/?$ index.php?modules=$1 [L]
y en el file index.php

Código PHP:
<?php 
if(isset($_GET['modules'])){
echo 
$_GET['modules'];
}
?>
si pones esto en el explore Web: www.sitio.com/un-folder-de-php/

el Resultado sera este: un-folder-de-php
y con la función explode() puedes cortar en pedazos ese texto.

pero no te quiero dejar el código así y te voy a explicar las limitaciones que ese código del .htaccess tiene
pero ami así me gusta y así lo uso.

1 por ejemplo si pones esto: www.sitio.com/un-folder-de-php/html/
te dará el Error 404 pero eso tiene solución y te explico mas adelante.
2 esta parte ([A-Za-z0-9-,]+) solo admite letras, numeros, comas (,) y -guion medio (-) si pones esto: www.sitio.com/un+folder-de-php/
te dará el Error 404 pero también tiene solución.
pero con ese codigo puedes usar esto: Options -Indexes FollowSymLinks en ves de esto: Options +Indexes FollowSymLinks
tu sabes que si usas esto, + estas permitiendo que se vean los files en un folder.
pero si usas esto, - de tira el Error 403

ahora te explico este punto: www.sitio.com/un-folder-de-php/html/ del Error 404.
yo se que si usas otra configuración en el: .htaccess el Error 404 nunca sucede, y se puede usar el index.php.
pero en ocasiones es necesario hacer saber a algunos usuarios mal intencionados del Error 404.
para lo de arriba solo usas así:
RewriteRule ^([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/?$ index.php?modules=$1&page=$2&index=$3 [L,QSA]
ahora ya puedes usar así:
www.sitio.com/un-folder-de-php/id/27/
y en index.php
Código PHP:
<?php 
if(isset($_GET['modules'])){
echo 
$_GET['modules'].'<br />';
echo 
$_GET['page'].'<br />';
echo 
$_GET['index'];
}
?>
el Resultado sera este:
un-folder-de-php
id
27

pero si ves bien el código veras que solo esta permitido esto -
mira bien el primero y veras que después del: 9 sigue un - y una coma , eso esta permitido en el acople. puedes cambiar el guion - por esto + o esto ? etc. y la coma también.
y por ultimo si tu solo admites esto Ejemplo: www.sitio.com/php/html-js/css/

pero si alguien viene y pone: www.sitio.com/php/html/css/asp+java/ dará el Error 404.




--
__________________
╬-----╬
║☺₧☻║
╬-----╬

Última edición por thezzin; 05/10/2009 a las 20:33
  #5 (permalink)  
Antiguo 05/10/2009, 17:49
Avatar de destor77  
Fecha de Ingreso: noviembre-2004
Ubicación: Gálvez, Santa Fe, Argentina
Mensajes: 2.654
Antigüedad: 19 años, 6 meses
Puntos: 43
Respuesta: imprimir links amigables

estimado thezzin,
he seguido los que me has indicado, mi .htaccess quedo asi:
Código:
Options -Indexes FollowSymLinks
RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^([A-Za-z0-9-,]+)/?$ index.php?modules=$1 [L]
RewriteRule ^([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/?$ index.php?modules=$1&opcion=$2&id=$3 [L,QSA]
cuando entro a websa100/admin/articulos funciona

pero cuando hago click en

/websa100/admin/articulos/crear

me devuelve un error de objeto no encontrado.

que estoy haciendo mal?
  #6 (permalink)  
Antiguo 05/10/2009, 18:02
 
Fecha de Ingreso: septiembre-2008
Mensajes: 350
Antigüedad: 15 años, 8 meses
Puntos: 31
porque esto: [A-Za-z0-9-]+)/([A-Za-z0-9-]+)/([A-Za-z0-9-] solo esta limitado a 3 como te explique arriba y aquí: /websa100/admin/articulos/crear son 4
para eso tienes que agregar mas a abos lados es decir: uno o dos etc de esto ([A-Za-z0-9-] al final y otro así: index.php?modules=$1&opcion=$2&id=$3&idETC=$4 [L,QSA]


Código:
#---------
RewriteRule ^([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/?$ index.php?modules=$1&opcion=$2&id=$3&idETC=$4 [L,QSA]
#-------
Código PHP:
<?php 
if(isset($_GET['modules'])){
echo 
$_GET['modules'].'<br />';
echo 
$_GET['page'].'<br />';
echo 
$_GET['index'].'<br />';
echo 
$_GET['idETC'];
}
?>
y no me fije bien en tu .htaccess no puedes usar 2 index.php osea así como lo tienes:
RewriteRule ^([A-Za-z0-9-,]+)/?$ index.php?modules=$1 [L]
RewriteRule ^([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/?$ index.php?modules=$1&opcion=$2&id=$3 [L,QSA]


porque si no me equivoco te dará el Error 500

lo que puedes hacer es con dos file así:

RewriteRule ^([A-Za-z0-9-,]+)/?$ page.php?GETmodules=$1 [L]
RewriteRule ^([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/?$ index.php?modules=$1&opcion=$2&id=$3 [L,QSA]


y que el page.php?GETmodules=$1
le mande la información al index.php?modules=$1&opcion=$2&id=$3
no se si me entiendas lo que quiero decirte.

Pero si te funciona Bien!!

--
__________________
╬-----╬
║☺₧☻║
╬-----╬

Última edición por GatorV; 05/10/2009 a las 21:30
  #7 (permalink)  
Antiguo 05/10/2009, 18:39
Avatar de destor77  
Fecha de Ingreso: noviembre-2004
Ubicación: Gálvez, Santa Fe, Argentina
Mensajes: 2.654
Antigüedad: 19 años, 6 meses
Puntos: 43
Respuesta: imprimir links amigables

mmm no sigue sin funcionar, me tira error 404 (objeto no encontrado), veré como lo puedo solucionar :( gracias igual
  #8 (permalink)  
Antiguo 05/10/2009, 19:44
 
Fecha de Ingreso: abril-2009
Ubicación: Miami
Mensajes: 182
Antigüedad: 15 años
Puntos: 8
Sonrisa Respuesta: imprimir links amigables

Hola, me parece super interesante lo que han tratado, y guíandome un poco con todo lo que describen, intenté implementarlo en un website, PERO, siempre hay un pero jeje, en mi archivo .htaccess tengo lo siguiente:

Options FollowSymLinks
RewriteEngine On
RewriteRule ^empresas/([0-9]+)/?$ usuariosweb/index.php?id_empresa=$1 [NC,L]

mi web en este momento me tira las direcciones así:

miweb.com/usuariosweb/index.php?id_empresa=541 y yo lo que "pretendo" con ese archivo .htaccess es que me muestre en la barra de direcciones algo así como:

miweb.com/empresas/541

Resulta que mi web tiene la siguiente estructura:

root: acá están todos los archivos del root tales como contacto, inicio, etc
- usuariosweb: aca están los script que forman las web de los usuarios,
*index.php
* contacto.php
*descripcion.php
y es acá donde quiero implementar esto de las url amigables, pero, cuando hago lo que puse arriba primero, los estilos se van [y ya les puse <base href="http://www.miweb.com/" /> en la página index dentro de usuariosweb], y además, me encantaría saber si ahora para llamar la página ahora tengo que cambiar, antes la llamaba así:

<a href=usuariosweb/index.php?id_empresa=541>

ahora, como tendría que ser, así: ??
<a href=empresas/541>

de antemano gracias !!!
__________________
-----------------------------------
Éxitos !!! .. joao
  #9 (permalink)  
Antiguo 05/10/2009, 20:18
 
Fecha de Ingreso: septiembre-2008
Mensajes: 350
Antigüedad: 15 años, 8 meses
Puntos: 31
Respuesta: imprimir links amigables

Hola, joaowizard dices que los files css se van, si ahora tienes que poner la Ruta completa

si antes usabas así: css/stylo.css
ahora tendrá que ser así: http://www.miweb.com/css/stylo.css

si usas el, .htaccess puedes usar así <a href=empresas/541>
y de nuevo es mejor así: <a href="http://www.miweb.com/empresas/541">

pero si usas así: <a href=usuariosweb/index.php?id_empresa=541> no tendrá ningún inconveniente

pero esa es la idea, esto: index.php?id_empresa=541
por esto: id_empresa/541

esto: $host = "http://".$_SERVER['HTTP_HOST'];

te imprime esto: http://www.miweb.com/
o esto: http://localhost/
etc. depende como lo uses.

-
__________________
╬-----╬
║☺₧☻║
╬-----╬
  #10 (permalink)  
Antiguo 05/10/2009, 20:24
 
Fecha de Ingreso: abril-2009
Ubicación: Miami
Mensajes: 182
Antigüedad: 15 años
Puntos: 8
De acuerdo

gracias thezzin !!!!! ...

hola thezzin una vez mas ... una consulta ...

... me sale casi todo perfecto con las url amigables .. pero, una de las páginas carga fotos, y muestra una pequeña galería de imágenes de la empresa, y dependiendo del id_empresa toma las fotos correspondientes a ella, puse en mi .htaccess:

RewriteRule ^empresas/([0-9]+)/(.*)/?$ usuariosweb/index.php?id_empresa=$1&page=$2 [NC]

en page guardo nosotros/contacto/fotos/mapa, todos funcionan bien excepto el de las fotos, puse incluso la rura real de las fotos pero nada ... me dice que "no hay fotos aún para la empresa", y este mensaje lo saca cuando recibiendo el id_empresa recorre ese directorio y no encuentra sus fotos.. acaso tendrá algo que ver con los efectos SLIDE que tiene esa pequeña galería ?? es extraño, pq "recoge" el id_empresa, puse un echo $_GET['id_empresa']; y me imprime el id, por lo que deduzco que el .htaccess está bien ..no se que hacer con esto ... tienes alguna idea ??? gracias ...
__________________
-----------------------------------
Éxitos !!! .. joao

Última edición por GatorV; 05/10/2009 a las 21:52
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 16:34.