Det er muligt, men du skal bruge et RewriteMap
for at definere en mapping, som du kan bruge i en RewriteRule
.
Apache version 2.2 har ikke direkte databaseadgang, så du bliver nødt til at skrive et script, der udfører selve forespørgslen og derefter returnere resultatet. Du kan definere dette kort ved hjælp af "External Rewriting Program" .
Så hvis du har et script, der tager "cats" fra stdin, derefter forespørger databasen og returnerer "1", ville du definere det sådan:
RewriteMap item_lookup prg:/path/to/item_lookup.php
Det direktiv skal være i din server eller vhost-konfiguration, det kan ikke være i en htaccess-fil. Men du kan bruge tilknytningen i en htaccess-fil:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /item.php?id=${item_lookup:$1} [L]
Så dette tager URI'en /cats
og omskriver det til /item.php?id=1
.
Hvis du bruger apache 2.4, så kan du drage fordel af " DBD" kort . Du kan indsætte en forespørgsel direkte i kortdefinitionen uden at skulle bruge et eksternt script. Du ville bruge det på samme måde.
RewriteMap item_lookup "fastdbd:SELECT id FROM items WHERE name = %s"
Brug det derefter på samme måde:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /item.php?id=${item_lookup:$1} [L]
Uden at bruge en DBD/FastDBD-forespørgsel, tror jeg, at du ærlig talt er bedre stillet blot at foretage databaseopslag fra item.php
, da du alligevel ville duplikere alt det arbejde i et andet eksternt script. Bare tilføje noget som:
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]
Og i din item.php
script, tjek for begge id og navn . Hvis du har et navn , lav databaseopslaget for at gøre det til et id. Det er meget nemmere at administrere, du behøver ikke at have server/vhost-konfigurationsadgang, og du komplicerer ikke sagerne ved at bruge et omskrivningskort.