URL de reescritura de página de base de datos dinámica de PHP

6 minutos de lectura

¿Cómo puedo hacer www.mydomain.com/folder/?id=123 —> www.mydomain.com/folder/xCkLbgGge

Quiero que mi página de consulta de base de datos obtenga su propia URL, como he visto en Twitter, etc.

avatar de usuario
cris

Esto se conoce como wordpress “slug” y popularizó este término. De todos modos, sin embargo.

En última instancia, lo que debe hacer es tener un archivo .htaccess que atrape todo su tráfico entrante y luego lo reforme a nivel del servidor para que funcione con su PHP en el sentido de que aún mantendrá intacta la lógica ?id=123, pero para el cliente side ‘/carpeta/FHJKD/’ será el resultado visible.

aquí hay un ejemplo de un archivo .htaccess en el que uso una lógica similar … (también lo hace wordpress).

RewriteEngine On
#strips the www out of the domain if there
RewriteCond %{HTTP_HOST} ^www\.domain\.com$

#applies logic that changes the domain from http://mydomain.com/post/my-article
#to resemble http://mydomain.com/?id=post/my-article
RewriteRule ^(.*)$ http://domain.com/$1 [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?id=$1 [QSA,L]

lo que esto hará es tomar todo después de domain.com/ y pasarlo como una variable a index.php, la variable en este ejemplo sería ‘id’ a partir de esto, debe diseñar la lógica que mejor se adapte a las necesidades de su sitio.

ejemplo

<?php
 //the URL for the example here: http://mydomain.com/?id=post/my-article
 if($_GET['id'])
 {
   $myParams = explode("https://stackoverflow.com/", $_GET['id']);
   echo '<pre>';
   print_r($myParams);
   echo '</pre>';
 }
?>

ahora la lógica para esto tendría que ser mucho más profunda, esto es solo un ejemplo puro en un nivel básico, pero en general y especialmente porque su trabajo con una base de datos supongo, querrá asegurarse de que $myParams esté libre de código malicioso, eso puede inyectar en su PHP o base de datos.

La salida de lo anterior $myParams a través de print_r() sería:

Array(
   [0] => post
   [1] => my-article
)

Para trabajar con él tendrías que hacer al menos

echo $myParams[0].'<br />';

o podría hacerlo así porque la mayoría de los navegadores agregarán un final /

<?php
 //the URL for the example here: http://mydomain.com/?id=post/my-article
 if($_GET['id'])
 {
   //breaks the variable apart, removes any empty array values and reorders the index
   $myParams = array_values(array_filter(explode("https://stackoverflow.com/", $_GET['id'])));
   if(count($myParams > 1)
   {
       $sql = "SELECT * FROM post_table WHERE slug = '".mysql_real_escape_string($myParams[1])."'";
       $result = mysql_query($sql);
   }

 }
?>

Ahora bien, es cierto que este es un ejemplo muy crudo, le gustaría trabajar con algo de lógica allí para evitar la inyección de mysql, y luego aplicará la consulta como lo haría ahora al extraer sus artículos usando solo id = 123.

Alternativamente, también podría tomar una ruta completamente diferente y explorar las maravillas de MVC (Model View Control). Algo así como CodeIgniter es un marco MVC fácil y agradable para comenzar. Pero eso depende de ti.

  • Esto parece muy complicado para que funcione. Necesito usarlo en las páginas que los usuarios agregarán a la base de datos. ¿Hay algún ejemplo de trabajo para esta técnica? – los únicos con los que me encontré describiendo esto, requieren cambios en la configuración del servidor apache.

    – usuario1121487

    14 de junio de 2012 a las 17:18

  • Es un poco complicado, sí, pero… es más o menos la única forma de lograr lo que quieres. Necesitas tener el htaccess de la manera que mencioné, luego, en base a eso, cada solicitud entrante pasará por tu index.php, todo lo que siga después de .com/ será tratado como una variable muy similar a un parámetro $_GET, es decir: .com/? identificación = 123. Con eso, básicamente construye su sitio de la misma manera que lo haría normalmente. La misma lógica se aplica para obtener los datos de la base de datos como lo hacía antes, solo tiene que trabajar con la variable de obtención de manera un poco diferente en la carga inicial.

    – chris

    14/06/2012 a las 17:50

  • desafortunadamente, no hay ningún ejemplo después del que se muestra, ya que literalmente todos tienen una necesidad diferente. En mi ejemplo, convierto la variable ID en una matriz usando explotar para $myParams[0] sería tu punto de partida. Ahora, la mayoría de las personas agregarán una columna adicional a las tablas de la base de datos como mínimo, de esta manera pueden adaptar lo que tienen a este concepto fácilmente sin cambiar demasiado. Ahora, esta columna sería la parte slug .com/my-article en su URL, la columna almacenaría “my-article”, buscaría eso y trabajaría con él como lo haría con cualquier otro DB pull

    – chris

    14 de junio de 2012 a las 17:53

  • Actualicé mi publicación original para ampliar lo que estoy hablando. Sin embargo, como dije, desafortunadamente, debido a que todas las necesidades son diferentes, no hay un ejemplo distinto para usar después de lo que parece ser poca lógica con la que trabajar. En general, la única forma de lograr lo que desea es comenzar con el parche htaccess inicial que sobrescribe el comportamiento central de Apache para su necesidad, luego, al hacerlo, todo lo que sigue depende de lo que haga con PHP o el lenguaje de secuencias de comandos del lado del servidor. de elección. Su más que bienvenido a ponerse en contacto conmigo si lo desea y tal vez podamos resolverlo.

    – chris

    14 de junio de 2012 a las 18:14

  • ¡Muchos gracias! Intentaré entrar en esto, aunque todavía hay muchos signos de interrogación. Comenzaré con lo básico primero y trataré de comprender este concepto. La única solución alternativa que se me ocurre es escribir un script que cree un archivo index.php con el código db como un include, y ponerlo en una carpeta con un nombre aleatorio. Aunque no tan ordenado.

    – usuario1121487

    14 de junio de 2012 a las 18:39

avatar de usuario
Valerij

Esto se puede lograr con mod_rewrite por ejemplo, a través de la .htaccess expediente.

En su .htacess, necesita agregar RewriteEngine.

Después de eso, necesitarás hacer algunas expresiones regulares para que esta pequeña bestia funcione. Supongo que ?id es folder.php?id=123.

Por ejemplo, la pieza de la carpeta: RewriteRule ^folder/([a-zA-Z0-9_-]+)/([0-9]+).html$ carpeta.php?id=$123

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad