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.