È possibile, ma è necessario utilizzare una RewriteMap
per definire una mappatura che puoi usare all'interno di una RewriteRule
.
Apache versione 2.2 non ha accesso diretto al database, quindi dovrai scrivere uno script che esegua la query effettiva e poi restituisca il risultato. Puoi definire questa mappa utilizzando il "Programma di riscrittura esterno" .
Quindi, se hai uno script che prende "cats" da stdin, quindi interroga il database e restituisce "1", lo definiresti in questo modo:
RewriteMap item_lookup prg:/path/to/item_lookup.php
Quella direttiva deve essere nella configurazione del tuo server o vhost, non può essere in un file htaccess. Ma puoi usare la mappatura in un file htaccess:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /item.php?id=${item_lookup:$1} [L]
Quindi questo prende l'URI /cats
e lo riscrive in /item.php?id=1
.
Se stai usando apache 2.4, puoi sfruttare il " mappa DBD" . Puoi inserire una query direttamente nella definizione della mappa, evitando di dover utilizzare uno script esterno. Lo useresti allo stesso modo.
RewriteMap item_lookup "fastdbd:SELECT id FROM items WHERE name = %s"
Quindi usalo allo stesso modo:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /item.php?id=${item_lookup:$1} [L]
Senza usare una query DBD/FastDBD, penso che tu stia onestamente meglio semplicemente facendo la ricerca nel database da item.php
, dal momento che duplicheresti comunque tutto quel lavoro in un secondo script esterno. Basta aggiungere qualcosa come:
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]
E nel tuo item.php
script, controlla entrambi gli id e nome . Se hai un nome , esegui la ricerca nel database per trasformarlo in un id. È molto più semplice da gestire, non è necessario disporre dell'accesso alla configurazione del server/host virtuale e non stai complicando le cose utilizzando una mappa di riscrittura.