sql >> Base de Datos >  >> RDS >> Mysql

¿Es posible consultar una base de datos usando un valor pasado en una URL y escribir el resultado de la consulta en la URL usando mod_rewrite?

Es posible, pero debe usar un RewriteMap para definir una asignación que puede usar dentro de una RewriteRule .

La versión 2.2 de Apache no tiene acceso directo a la base de datos, por lo que deberá escribir un script que realice la consulta real y luego devuelva el resultado. Puede definir este mapa usando el "External Rewrite Program" .

Entonces, si tiene un script que toma "cats" de stdin, luego consulta la base de datos y devuelve "1", lo definiría así:

RewriteMap item_lookup prg:/path/to/item_lookup.php

Esa directiva tiene que estar en su servidor o configuración de vhost, no puede estar en un archivo htaccess. Pero puede usar la asignación en un archivo htaccess:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /item.php?id=${item_lookup:$1} [L]

Entonces esto toma el URI /cats y lo vuelve a escribir en /item.php?id=1 .

Si está utilizando apache 2.4, entonces puede aprovechar el " Mapa DBD" . Puede insertar una consulta directamente en la definición del mapa, sin tener que usar un script externo. Lo usarías de la misma manera.

RewriteMap item_lookup "fastdbd:SELECT id FROM items WHERE name = %s"

Luego úsalo de la misma manera:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /item.php?id=${item_lookup:$1} [L]

Sin utilizar una consulta DBD/FastDBD, creo que, sinceramente, es mejor hacer la búsqueda en la base de datos desde item.php , ya que estaría duplicando todo ese trabajo en un segundo script externo de todos modos. Solo agrega algo como:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^item/([0-9]+)$ /item.php?id=$1 [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([A-Za-z0-9-]+)$ /item.php?name=$1 [L]

Y en tu item.php secuencia de comandos, verifique tanto id y nombre . Si tienes un nombre , haga la búsqueda en la base de datos para convertir eso en una identificación. Es mucho más fácil de administrar, no necesita tener acceso a la configuración del servidor/vhost y no está complicando las cosas usando un mapa de reescritura.