Det är möjligt, men du måste använda en RewriteMap
för att definiera en mappning som du kan använda inom en RewriteRule
.
Apache version 2.2 har inte direkt databasåtkomst så du måste skriva ett skript som gör själva frågan och sedan returnera resultatet. Du kan definiera denna karta med "External Rewriting Program" .
Så om du har ett skript som tar "cats" från stdin, sedan frågar databasen och returnerar "1", skulle du definiera det så här:
RewriteMap item_lookup prg:/path/to/item_lookup.php
Det direktivet måste finnas i din server eller vhost-konfiguration, det kan inte finnas i en htaccess-fil. Men du kan använda mappningen i en htaccess-fil:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /item.php?id=${item_lookup:$1} [L]
Så detta tar URI:n /cats
och skriver om det till /item.php?id=1
.
Om du använder apache 2.4 kan du dra fördel av " DBD" karta . Du kan infoga en fråga direkt i kartdefinitionen, utan att behöva använda ett externt skript. Du skulle använda det på samma sätt.
RewriteMap item_lookup "fastdbd:SELECT id FROM items WHERE name = %s"
Använd den sedan på samma sätt:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /item.php?id=${item_lookup:$1} [L]
Utan att använda en DBD/FastDBD-fråga tror jag att du ärligt talat är bättre av att bara göra en databassökning från item.php
, eftersom du skulle duplicera allt detta arbete i ett andra externt skript ändå. Lägg bara till något 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]
Och i din item.php
skript, leta efter båda id och namn . Om du har ett namn , gör databassökningen för att göra det till ett id. Det är mycket enklare att hantera, du behöver inte ha åtkomst till server/vhost-konfiguration och du komplicerar inte saken genom att använda en omskrivningskarta.