Je to možné, ale musíte použít RewriteMap
k definování mapování, které můžete použít v rámci RewriteRule
.
Apache verze 2.2 nemá přímý přístup k databázi, takže budete muset napsat skript, který provede skutečný dotaz a vrátí výsledek. Tuto mapu můžete definovat pomocí "Externí program pro přepisování" .
Takže pokud máte skript, který bere "cats" ze stdin, pak se dotazuje na databázi a vrací "1", definovali byste to takto:
RewriteMap item_lookup prg:/path/to/item_lookup.php
Tato direktiva musí být v konfiguraci serveru nebo vhost, nemůže být v souboru htaccess. Ale můžete použít mapování v souboru htaccess:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /item.php?id=${item_lookup:$1} [L]
Takže to trvá URI /cats
a přepíše to na /item.php?id=1
.
Pokud používáte apache 2.4, můžete využít " DBD" map . Dotaz můžete vložit přímo do definice mapy, aniž byste museli používat externí skript. Použili byste ho stejným způsobem.
RewriteMap item_lookup "fastdbd:SELECT id FROM items WHERE name = %s"
Poté jej použijte stejným způsobem:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /item.php?id=${item_lookup:$1} [L]
Bez použití dotazu DBD/FastDBD si myslím, že je pro vás upřímně lepší provést vyhledání databáze z item.php
, protože byste stejně veškerou práci duplikovali v druhém externím skriptu. Stačí přidat něco jako:
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]
A ve vašem item.php
skript, zkontrolujte obě id a jméno . Pokud máte jméno , proveďte vyhledávání v databázi, abyste to převedli na id. Je to mnohem jednodušší na správu, nepotřebujete mít přístup ke konfiguraci serveru/vhost a nekomplikujete věci používáním přepisovací mapy.