Problema con URL amigable

Buenas antes de nada dar las gracias al foro y a toda la gente que hace que cada dia seamos un poco más inquietos.

Paso a relatar mi problema.

Resulta que yo tengo mi página ejem:(index.php) y mediante un link (href="noticia/") se hace la petición GET.

Una vez hecho el get genero un include hacia mi index y aqui esta el problema con la URL amigable ya que como se carga la pagina a la que llamo en el index los demas enlaces con URL amigable también prestan en la barra de direcciones como si estubiese dentro de noticias/.


Ejemplo de lo que me pasa:

Al pulsar el link se muestra esto en la URL localhost/noticias/.

Ahora al pulsar sobre otro link queda del siguiente modo localhost/noticias/prueba/.

Yo lo que quiero es que cambie el localhost/noticias/ por localhost/prueba/ y manteniendo los includes hacia el index o si hay algun otro metodo me lo decis todo es aprender.

Gracias otra vez y espero con impetu vuestra respuesta.
Hola:

Lo más simple es utilizar mod_rewrite (dependiendo del servidor, el módulo puede tener un nombre distinto). En el servidor Apache (el que utiliza Xampp y Wamp), podrías poner esto en un archivo .htaccess (incluyendo el punto):

<IfModule mod_rewrite.c>
  RewriteEngine On # Activas el motor de sobre escritura
  RewriteBase / # Luego lo explico
  RewriteRule ^(.+)/(.+)$ index.php?categoria=$1&busqueda=$2 [NC,L,QSA]
  RewriteRule ^buscar/(.+)$ index.php?buscar=$1 [NC,L,QSA]
  # Puedes poner todos los RewriteRule que quieras
</IfModule>

RewriteBase no es necesario, pero si se usa, entonces Apache entenderá que debe buscar la ruta en los RewriteRule bajo la ruta RewriteBase. Por ejemplo, si se usa RewriteBase /, se esta diciendo que index.php estará bajo la carpeta principal del sitio web; si se utiliza RewriteBase /rewrite/, se entenderá que index.php estará dentro de la carpeta rewrite que está dentro de la carpeta raíz.

[NC,L,QSA] son modificadores para las reglas de sobre escritura separados por una coma y significan lo siguiente:

- L significa last (último) y le dice al motor que debe detenerse ahí y no procesar las siguientes reglas (RewriteRule).
- NC significa no case y quiere decir que no distingue entre minúsculas y mayúsculas, por ende, MiNombre será igual a minombre.
- QSA significa query string append (añadir cadena consulta) y añade la cadena de consulta a la URL sobre escrita. Por ejemplo, si se recibe esto: midominio.algo/computadores/dell?orderby=precio&limit=15, la URL reescrita quedaría como index.php?categoria=computadores&busqueda=dell&orderby=precio&limit=15, pero si no se utiliza QSA, la URL reescrita sería index.php?categoria=computadores&busqueda=dell.

mod_rewrite esta presente en todos los servidores decentes y siempre está habilitado, así que no debes preocuparte por la compatibilidad. De esta forma le quitas trabajo a PHP y haces un poco más eficiente tu aplicación.

Suerte :).
Ya tengo esto hecho el problema es el siguiente te dejo la URL para que veas que es lo que me sucede.

Link

La redirección me la hace pero si pinchas varias veces mira lo que pasa en la URL.
Aaaaah, entonces, podrías mostrarme el .htaccess? En algún lugar estás asignando la URL a la nueva URL generada.
si claro aqui tienes el .htaccess

RewriteEngine on
RewriteRule ^(.*)/$ index.php?hola=$1

Podria ser porque tengo la / puesta después de la expresión regular?

Muchas gracias por tu atención [:)]
Yo tampoco tengo ni idea, puede ser por el RewriteBase, prueba a poner el código cómo te lo dejó skaparate:
<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteBase /
  RewriteRule ^(.+)$ index.php?hola=$1 [NC,L,QSA]
</IfModule>
Me sigue pasando lo mismo :( gracias por la ayuda de todos modos seguire mirando
Que extraño...

Podria ser porque tengo la / puesta después de la expresión regular?

No debería... pero como el mundo de la informática es algo extraño a veces, añade un signo de pregunta después del /:

RewriteRule ^(.+)/[B]?[/B]$ index.php?hola=$1

Cambié el asterisco por un más porque quizás eso es lo que esta duplicando las partes de la URL. * significa 0 o más veces, mientras que + significa al menos 1 o más veces.
hay alguna manera de decirle que la reescritura se haga sin entrar en ninguna carpeta?

Porque lo que me hace es que se mete dentro de load/(y es aqui donde va poniendo luego las cosas).

Por esto pregunto si se puede hacer que no se meta dentro de ninguna carpeta esa expresión en concreto.

La verdad esque me estoy volviendo un poco loco con el tema pero vamos que no entiendo porque hace eso.
Prueba a dejarlo así a ver qué pasa:
<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteBase /
  RewriteRule ^load/(.+)$ index.php?hola=$1 [NC,L,QSA]
</IfModule>
Sigue pasando lo mismo XD no se como hacerlo [:?][:?]

Gracias por la pesadilla si pongo el código php ayudaria de algo?

Pero es muy simple.


<a href="load/pedro">Pinchame</a>
<?php
	echo $_GET['hola'];
?>
¿Ese es todo el código PHP involucrado? No debería ocurrir lo que dices al comienzo...
Si solamente tengo eso de cógido para hacer las pruebas, he probado poniendo enlaces distintos pero sigue haciendo lo mismo.
¿Puede ser por dónde tienes localizado el .htaccess? La verdad no tengo ni idea idea pero igual influye si está en la carpeta raíz (public_html) o el directorio donde tienes el archivo.
Pues he probado lo que me comentas y no he conseguido nada sigue todo igual, podrias pasarme un enlace para ver las propiedades de MOD_REWRITE para hecharle un ojo, lo mismo esque me falta de agregar algun parametro.
Si hago lo mismo con rutas absolutas no pasa eso, pero yo quiero saber si se puede hacer con rutas relativas puesto que es más corto crear enlaces relativos
Aaaah, creo que encontré el problema :P....

Cuando se usan rutas relativas dentro de un archivo, esta ruta se refiere a la carpeta donde está actualmente el archivo, a no ser de que esta comience por un /, en cuyo caso se refiere a la raíz del sitio web. Por ejemplo:

raíz
-- carpeta1
---- c1.php
-- carpeta2
---- c2.php
-- index.php

Si yo agrego un enlace así a index.php:

<a href="carpeta1/c1.php">C1</a>

Le estoy diciendo al servidor que el archivo está un nivel más abajo que el archivo index.php. Ahora, si yo añado el mismo enlace al archivo c2.php, el servidor creará una ruta así: /carpeta2/carpeta1/c1.php, lo que no existe.

Lo correcto, entonces, es usar una ruta relativa a la raíz de tu sitio web: /carpeta1/c1.php.

En resumen, añade el slash (/) al comienzo de tus enlaces para que funcione bien y no se añadan más elementos a la URL.
oye pues muchas gracias de verdad me has ayudado mucho (tu como los demas el hecho de tener este foro ya es una ayuda) me ha solucionado el problema
Buenas amigos. Reabro el tema porque estoy intentando adaptar una regla de .htacces para mi proyecto y vengo de hace unos días y no hallo solución. Por eso recurro a ustedes, por favor.
Este es el proyecto:

Mi página no amigable:
http://localhost/detalle?nombre=portasahumerio-chico5&id=3

La página que necesito que sea amigable:
http://localhost/portasahumerio-chico#3

Donde necesito que la página amigable, por ejemplo, sea:
1era. parte: "portasahumerio-chico" = a la variable "nombre".
2nda. parte: "#3" = a la variable "id".

HTACCES:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ -
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php
# Intenté con este código:
#RewriteRule ^(.+)#(.+)$ localhost/detalle?nombre=$1&id=$2
</IfModule>

Esquema de mi sitio:

[contenido no disponible]

Formulario de regaleria.php:
<form action="/detalle" method="get" name="detalle">
<input name="nombre" type="hidden" value="<?php echo $nombre ?>" />
<input name="id" type="hidden" value="<?php echo $id ?>" />
<input type="submit" value="Detalle" />
</form>
@mikehove:

Lamentablemente lo que pides no se puede hacer, porque el símbolo de número (#) nunca se envía al servidor, por lo que no puedes usarlo. Este símbolo se interpreta en el navegador y no en el servidor, por lo que el servidor nunca se entera de su existencia. Lo que hace Twitter, por ejemplo, (url/!#otra_parte_de_la_url) es utilizar Javascript para enviar las peticiones a través de AJAX y procesarlas en el navegador, así el servidor se entera de la petición.

Lo que sí funciona:

RewriteRule ^(.+)/(.+)$ localhost/detalle?nombre=$1&id=$2
Hola Skaparate. Probé con el código que me pasaste (que ya antes lo había probado) y no funciona.
¿Qué podrá ser?
Probablemente sea porque falta la extensión del archivo:

RewriteRule ^(.+)/(.+)$ localhost/detalle[COLOR="#FFA500"].php[/COLOR]?nombre=$1&id=$2
Aaah, pero tienes una carpeta llamada carpeta-content, no? Entonces te falta añadir esta carpeta:

RewriteRule ^(.+)/(.+)$ localhost/carpeta-content/detalle?nombre=$1&id=$2
Sí, Skaparate, tengo esa carpeta. Gracias por contestarme.

Algunas pruebas:

1- Probé con tu regla y no me funciona bien porque solo se ve el "css" y no el contenido del "producto" e "id".
2- Modifiqué el formulario de "/regaleria" y le agregué una ruta absoluta con su ".php".
"<form action="/content/detalle.php" method="get" name="detalle">"

Al enviar este formulario, la página "/detalle", se ve bien el "producto" e "id" (pero sin CSS):
"http://localhost/content/detalle.php?nombre=portasahumerio&id=4"

3- En el HTACCESS:
<IfModule mod_rewrite.c>
Options +FollowSymLinks
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ -
RewriteRule ^(.+)-(.+)$ content/detalle.php?nombre=$1&id=$2
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php
</IfModule>

4- Dirección amigable (si se tipea y aparece sin CSS) :
"localhost/portasahumerio-4"


CONCLUSION:
Hasta ahora funciona independientemente, quiero decir, si uno envía el formulario de la página "regaleria" a "detalles" estos llegan y muestra su respectivo "nombre" e "id" de producto: Sin css y tampoco con su URL amigable.

¿Por dónde podré seguir para llegar al éxito, amigo/s?

mikehove.-
Prueba nuevamente con la regla que yo te mostré en el último mensaje, pero esta vez revisa la consola de errores del navegador. Usualmente, esta consola se abre al presionar el botón F12 y luego debes ir a la pestaña console.

Yo creo que en el código estás utilizando mal las rutas, por lo que el navegador no encuentra los archivos CSS. Copia los errores y publícalos acá para poder saber que ocurre (si es que no entiendes lo que significan).