Foros del Web » Programando para Internet » PHP »

Conflicto HTACCESS y PHP

Estas en el tema de Conflicto HTACCESS y PHP en el foro de PHP en Foros del Web. Buenas queridos amigos. Antes de presentar mi problema quiero agradecer a todos los que en otros post me ayudaron, y especialmente a Triby y Pateketrueke. ...
  #1 (permalink)  
Antiguo 23/09/2014, 23:37
 
Fecha de Ingreso: abril-2012
Ubicación: Argentina
Mensajes: 215
Antigüedad: 12 años
Puntos: 2
Conflicto HTACCESS y PHP

Buenas queridos amigos. Antes de presentar mi problema quiero agradecer a todos los que en otros post me ayudaron, y especialmente a Triby y Pateketrueke.

Trataré de ser conciso con este tema. Tengo conflicto con PHP y HTACCESS que se refieren a URLs amigables.

Contenido duplicado:
  • "http://localhost/producto?nombre=miProducto&id=4"---Al hacer click en el envío del formulario "regaleria.php" a "producto.php".
  • "http://localhost/producto/miProducto/4"--- Mi URL amigable que solo aparece cuando se escribe en la URL, sin la img y css.

Formulario "regaleria.php":
Código PHP:
<form action="/producto" method="get" name="producto">
            <input name="nombre"  type="hidden" value="<?php echo $nombre ?>" />
            <input name="id" type="hidden" value="<?php echo $id ?>" />
            <input  type="submit" value="Detalle" />
</form>
HTACCES:
Código:
<IfModule mod_rewrite.c>
Options +FollowSymLinks
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^producto/(.+)/(.+)$ index.php?r=producto&nombre=$1&id=$2 [L,QSA]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* index.php [L,QSA]
</IfModule>
BD:


Alguna ayuda amigos por favor, para eliminar el contenido duplicado y solo haciendo clic en el formulario me salga la URL amigable.
  #2 (permalink)  
Antiguo 24/09/2014, 04:34
Avatar de CHuLoSoY  
Fecha de Ingreso: febrero-2002
Ubicación: Ribeira (Galicia)
Mensajes: 1.900
Antigüedad: 22 años, 2 meses
Puntos: 29
Respuesta: Conflicto HTACCESS y PHP

Para eliminar duplicados debes controlarlo primero por php y luego por mysql. Es decir, con PHP compruebas que no exista antes de meterlo, y para una seguridad mejor, en mysql puedes especificar que un campo sea único.

Por otro lado, el formulario te enviará a una url tal que así:

Cita:
/producto?nombre=XXX&id=XXX
No sé si será mejor que lo controles por JS. Te pongo un ejemplo con jquery:

Código Javascript:
Ver original
  1. var form = $('form[name=producto])');
  2. form.on('submit', function(event) {
  3.    event.preventDefault(); // evitamos que el submit se haga por ahora
  4.    var nombre form.find('input[name=nombre]').val(); //valor de nombre
  5.    var id form.find('input[name=id']).val(); // valor de id
  6.  
  7.    form.attr('action', '/producto/'+nombre+'/'+id); //cambiamos el action
  8.    form.submit(); // hacemos el submit
  9. });

También puedes hacerlo sin jquery, pero creo que el código de arriba es muy claro.

Saludos.
__________________
ESQUIO Dominios y Hosting
Las mejores características con los mejores precios.

Última edición por CHuLoSoY; 24/09/2014 a las 04:35 Razón: Enviado antes de terminarlo, edito para finalizar el escrito
  #3 (permalink)  
Antiguo 24/09/2014, 16:15
 
Fecha de Ingreso: abril-2012
Ubicación: Argentina
Mensajes: 215
Antigüedad: 12 años
Puntos: 2
Respuesta: Conflicto HTACCESS y PHP

Gracias por responderme CHuLoSoY.
Te comento que adapté tu idea de Javascript y aparecen algunos defectos cuando envío el formulario:

*Directamente se tilda.
*Y si bloqueo "event.preventDefault();" este se envía pero aparecen otros 2 errores, además que tarda en pasar a la otra página:

1- "http://localhost/producto/miProducto5/id2?nombre=miProducto5&id=id2".
2- Esto pasa si elijo otro producto y envío el formulario:
"http://localhost/producto/muestra-nombre-de-producto-incorrecto/muestra-id-incorrecto?nombre=miProducto4&id=4".


Aclaro que lo único correcto son las variables php que están marcadas en color lila.

Tú código completo con un poquito más de sintaxis:
Código Javascript:
Ver original
  1. var form = $('form[name="producto"]');
  2.  
  3.  form.on('submit', function(event) {
  4.     event.preventDefault(); // evitamos que el submit se haga por ahora  
  5.     var nombre = form.find('input[name="nombre"]').val(); //valor de nombre
  6.     var id = form.find('input[name="id"]').val(); // valor de id
  7.     form.attr('action', '/producto/'+nombre+'/'+id); //cambiamos el action  
  8.     form.submit(); // hacemos el submit
  9.   });

¿Qué estaré haciendo mal, por favor?

Última edición por mikehove; 24/09/2014 a las 23:12
  #4 (permalink)  
Antiguo 25/09/2014, 08:43
Colaborador
 
Fecha de Ingreso: septiembre-2013
Ubicación: España
Mensajes: 3.648
Antigüedad: 10 años, 8 meses
Puntos: 578
Respuesta: Conflicto HTACCESS y PHP

Lo de hacer urls amigables con base de datos nunca me ha gustado

La manera más eficiente para evitar que un motor de búsqueda tome contenido como duplicado, es haciendo una redirección permanente:

Código Apache:
Ver original
  1. RewriteRule ^producto/(.+)/(.+)$ index.php?r=producto&nombre=$1&id=$2 [L,R=301,QSA]

Así te ahorras cambiar las URLs una a una...
  #5 (permalink)  
Antiguo 25/09/2014, 13:53
 
Fecha de Ingreso: abril-2012
Ubicación: Argentina
Mensajes: 215
Antigüedad: 12 años
Puntos: 2
Respuesta: Conflicto HTACCESS y PHP

Hola PHPeros. Gracias por responder mi pedido de auxilio. Apliqué la redirección que me pasaste y funciona, en parte, porque:

SOLUCION: Ya no hay duplicado.

PROBLEMA: Convertir esta redirección en URL amigable.

Esto es lo que pasa:
  • Cuando hago clic en el formulario y pasa a la siguiente página, en la URL, aparece:
    "http://localhost/producto?nombre=miProducto4&id=4".
  • Cuando escribo la URL amigable, por ejemplo:
    "http://localhost/producto/miProducto4/4", me redirecciona automáticamente con:
    "http://localhost/producto?nombre=miProducto4&id=4".

Código Apache:
Ver original
  1. <IfModule mod_rewrite.c>
  2. Options +FollowSymLinks
  3. RewriteEngine On
  4. RewriteBase /
  5. RewriteCond %{REQUEST_FILENAME} !-f
  6. RewriteCond %{REQUEST_FILENAME} !-d
  7.  
  8. RewriteRule ^producto/(.+)/(.+)$ producto?nombre=$1&id=$2 [L,R=301,QSA]
  9.  
  10. RewriteCond %{REQUEST_FILENAME} !-f
  11. RewriteCond %{REQUEST_FILENAME} !-d
  12. RewriteRule .* index.php [L,QSA]
  13. </IfModule>

¿Dónde estaré pifiando, por favor?

Última edición por mikehove; 26/09/2014 a las 06:53
  #6 (permalink)  
Antiguo 26/09/2014, 08:24
Colaborador
 
Fecha de Ingreso: septiembre-2013
Ubicación: España
Mensajes: 3.648
Antigüedad: 10 años, 8 meses
Puntos: 578
Respuesta: Conflicto HTACCESS y PHP



Supongo que lo que quieres hacer es mantener la URL amigable y la antigua redireccionarla a la nueva, ¿no?
  #7 (permalink)  
Antiguo 26/09/2014, 12:41
 
Fecha de Ingreso: abril-2012
Ubicación: Argentina
Mensajes: 215
Antigüedad: 12 años
Puntos: 2
Respuesta: Conflicto HTACCESS y PHP

Amigo, sí!
Me explico:

Cuando clicqueo "Ver detalle" de cierto producto de "regaleria.php" envío un formulario hacia la página "producto.php", al abrirse esta, en la URL, por ejemplo, muestra esto:
Código HTML:
Ver original
  1. http://localhost/producto?nombre=miProducto5&id=2

Por otro lado, cuando escribo la URL amigable, refiriéndome a este mismo producto:
Código HTML:
Ver original
  1. http://localhost/producto/miProducto5/2
me lo redirecciona a la URL correcta y antigua, sin ser la amigable, de esta forma:
Código HTML:
Ver original
  1. http://localhost/producto?nombre=miProducto5&id=2

Código Apache:
Ver original
  1. RewriteRule ^producto/(.+)/(.+)$ producto?nombre=$1&id=$2 [L,R=301,QSA]

Lo que sí faltaría resolver cuando envíe el formulario que aparezca la URL amigable.
Es un rompecoco!
  #8 (permalink)  
Antiguo 26/09/2014, 13:25
Colaborador
 
Fecha de Ingreso: septiembre-2013
Ubicación: España
Mensajes: 3.648
Antigüedad: 10 años, 8 meses
Puntos: 578
Respuesta: Conflicto HTACCESS y PHP

Dudo que funcione...

Código Apache:
Ver original
  1. RewriteEngine On
  2.  
  3. RewriteCond %{QUERY_STRING} nombre=(.+)&id=(\d+)
  4.  
  5. RewriteRule ^producto/?$ /producto/%1/%2 [R=301,L]

No tengo un servidor disponible para probarlo
  #9 (permalink)  
Antiguo 26/09/2014, 14:43
 
Fecha de Ingreso: abril-2012
Ubicación: Argentina
Mensajes: 215
Antigüedad: 12 años
Puntos: 2
Respuesta: Conflicto HTACCESS y PHP

Amigo, muchas gracias por el intento.
Tenía un gran deseo que funcionara...

Sinceramente tengo seco el mate, no se cómo hacer...
Vengo hace días probando...

Tendré que tirar todo abajo y hacer un proyecto nuevo, supongo, adonde los códigos para páginas amigables funcionen.

Te agradezco de alma tu bondadosa ayuda.

Te comento que sigue apareciendo la URL antigua y también cuando la escribo con la amigable no me sale la página.

También creí que era un problema para recibir los parámetros y le agregué "[L,R=301,QSA]" pero no.
  #10 (permalink)  
Antiguo 26/09/2014, 15:31
 
Fecha de Ingreso: abril-2012
Ubicación: Argentina
Mensajes: 215
Antigüedad: 12 años
Puntos: 2
Respuesta: Conflicto HTACCESS y PHP

Estoy apenado... pero no me quiero dar por vencido.
Seguiré investigando, pidiendo ayuda también...
  #11 (permalink)  
Antiguo 27/09/2014, 03:56
Colaborador
 
Fecha de Ingreso: septiembre-2013
Ubicación: España
Mensajes: 3.648
Antigüedad: 10 años, 8 meses
Puntos: 578
Respuesta: Conflicto HTACCESS y PHP

Último intento por mi parte:

Código Apache:
Ver original
  1. RewriteEngine On
  2.  
  3. RewriteCond %{QUERY_STRING} nombre=(.+)&id=(\d+)
  4.  
  5. RewriteRule .* /producto/%1/%2 [R=301,L]

Si no funciona, pues eso... sigue investigando que seguro encuentras la solución
  #12 (permalink)  
Antiguo 28/09/2014, 11:06
 
Fecha de Ingreso: abril-2012
Ubicación: Argentina
Mensajes: 215
Antigüedad: 12 años
Puntos: 2
Respuesta: Conflicto HTACCESS y PHP

Gracias Phperos.
Tú código me tiró:
Código HTML:
Ver original
  1. http://localhost/producto/miProducto5/2?nombre=pad5&id=2

Chan!

Voy a ver por dónde sigo...
Otra vez: Gracias por el intento!
  #13 (permalink)  
Antiguo 29/09/2014, 10:16
Colaborador
 
Fecha de Ingreso: septiembre-2013
Ubicación: España
Mensajes: 3.648
Antigüedad: 10 años, 8 meses
Puntos: 578
Respuesta: Conflicto HTACCESS y PHP

Haz esto para evitar que el query string se añada a la nueva url:

Código Apache:
Ver original
  1. RewriteEngine On
  2.  
  3. RewriteCond %{QUERY_STRING} nombre=(.+)&id=(\d+)
  4.  
  5. RewriteRule .* /producto/%1/%2 [R=301,QSD,L]
  #14 (permalink)  
Antiguo 29/09/2014, 12:55
 
Fecha de Ingreso: abril-2012
Ubicación: Argentina
Mensajes: 215
Antigüedad: 12 años
Puntos: 2
Respuesta: Conflicto HTACCESS y PHP

Amigo, a modo de ironía digo: "sino me corto las venas ahora paso raspando" jejeje... Porque sí funcionó:

Código HTML:
Ver original
  1. http://localhost/producto/miProducto5/2

Buenísimo el redireccionamiento de la URL amigable, es lo que taaanto anhelaba, siii!!


... y me vas a "vas a mandar a freir papas o patatas" por no decir otra cosa jejee...

Porque no cargó el CSS, ni las imágenes.

Lo loco a todo esto es que con el antiguo código, que me habías pasado (claro que redireccionaba a la antigua URL) sí cargaba todas las imágenes, incluidas de la BD y las hojas de estilos:
Código Apache:
Ver original
  1. <IfModule mod_rewrite.c>
  2. Options +FollowSymLinks
  3. RewriteEngine On
  4. RewriteBase /
  5.  
  6. RewriteCond %{REQUEST_FILENAME} !-f
  7. RewriteCond %{REQUEST_FILENAME} !-d
  8. RewriteRule ^producto/(.+)/(.+)$ producto?nombre=$1&id=$2 [L,R=301,QSA]
  9.  
  10. RewriteCond %{REQUEST_FILENAME} !-f
  11. RewriteCond %{REQUEST_FILENAME} !-d
  12. RewriteRule .* index.php [L,QSA]
  13. </IfModule>

Capaz que borré algún dato importante en el HTACCESS actual:
Código Apache:
Ver original
  1. <IfModule mod_rewrite.c>
  2. Options +FollowSymLinks
  3. RewriteEngine On
  4. RewriteBase /
  5.  
  6. RewriteCond %{QUERY_STRING} nombre=(.+)&id=(\d+)
  7. RewriteRule .* /producto/%1/%2 [R=301,QSD,L]
  8.  
  9. RewriteCond %{REQUEST_FILENAME} !-f
  10. RewriteCond %{REQUEST_FILENAME} !-d
  11. RewriteRule .* index.php [L,QSA]
  12. </IfModule>
  #15 (permalink)  
Antiguo 30/09/2014, 08:28
Colaborador
 
Fecha de Ingreso: septiembre-2013
Ubicación: España
Mensajes: 3.648
Antigüedad: 10 años, 8 meses
Puntos: 578
Respuesta: Conflicto HTACCESS y PHP

¡Aleluya!

Pues no te queda otra que ir arhivo por archivo cambiando las URLs antiguas por las nuevas... Es lo que pasa cuando se hace redirección permanente.
  #16 (permalink)  
Antiguo 30/09/2014, 11:15
 
Fecha de Ingreso: abril-2012
Ubicación: Argentina
Mensajes: 215
Antigüedad: 12 años
Puntos: 2
Respuesta: Conflicto HTACCESS y PHP

Sí, ahora todo "joya"!

Lo que no entiendo a qué te refieres con modificar las URLs antiguas por las nuevas archivo por archivo, porque creo que los archivos relacionados son principalmente:

"regaleria.php" (donde se envía el formulario dinámicamente)

Código HTML:
Ver original
  1. <?php require_once('/bd/conexion.php'); ?>
  2.  
  3. <div class="contenedor-categorias" style="position:absolute;">
  4.      <?php
  5.      while($filas=mysql_fetch_array($consulta)){
  6.          $id=$filas['id'];
  7.          $imagen=$filas['imagen'];
  8.          ...     
  9.      ?>
  10.    <div class="caja">
  11.        <h4><?php echo $nombre ?></h4>
  12.        <img src="<?php echo $imagen ?>" width="100" height="90" />      
  13.        <p>$<?php echo $precio ?></p>
  14.  
  15.        <form action="/producto" method="get" name="detalle">
  16.             <input name="nombre"  type="hidden" value="<?php echo $nombre ?>" />
  17.             <input name="id" type="hidden" value="<?php echo $id ?>" />
  18.             <input type="submit" value="Detalle" />
  19.        </form>    
  20.  
  21.    </div>
  22.     <?php  
  23.     }
  24.     ?>
  25. </div>

"producto.php" (aquí llega)
Código HTML:
Ver original
  1. <?php
  2. require_once('/bd/conexion.php');
  3. $consulta=mysql_query("select * from productos where id=".$_GET['id']);
  4. ?>
  5. <div class="contenedor">
  6.     <?php
  7.     while($filas=mysql_fetch_array($consulta)){
  8.         $id=$filas['id'];
  9.         $imagen=$filas['imagen'];
  10.         $nombre=$filas['nombre'];
  11.         $desc=$filas['descripcion'];
  12.         ...
  13.     ?>  
  14.     <div class="cajaDes">
  15.         <p><h3>Descripción</h3></p>
  16.         <p><?php echo $desc?></p>      
  17.     </div> 
  18.     <?php
  19.     }  
  20.     ?>    
  21. </div>
  #17 (permalink)  
Antiguo 01/10/2014, 07:53
Colaborador
 
Fecha de Ingreso: septiembre-2013
Ubicación: España
Mensajes: 3.648
Antigüedad: 10 años, 8 meses
Puntos: 578
Respuesta: Conflicto HTACCESS y PHP

¿Usas urls absolutas o relativas? Intenta usar absolutas.

Última edición por PHPeros; 01/10/2014 a las 08:07

Etiquetas: htaccess, seo
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 19:31.