Jest to możliwe, ale musisz użyć RewriteMap
aby zdefiniować mapowanie, którego możesz użyć w RewriteRule
.
Apache w wersji 2.2 nie ma bezpośredniego dostępu do bazy danych, więc musisz napisać skrypt, który wykona zapytanie, a następnie zwróci wynik. Możesz zdefiniować tę mapę za pomocą „Zewnętrznego programu przepisywania” .
Więc jeśli masz skrypt, który pobiera „cats” ze standardowego wejścia, a następnie wysyła zapytanie do bazy danych i zwraca „1”, zdefiniujesz go w ten sposób:
RewriteMap item_lookup prg:/path/to/item_lookup.php
Ta dyrektywa musi znajdować się w konfiguracji twojego serwera lub vhosta, nie może być w pliku htaccess. Ale możesz użyć mapowania w pliku htaccess:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /item.php?id=${item_lookup:$1} [L]
To wymaga identyfikatora URI /cats
i przepisuje to do /item.php?id=1
.
Jeśli używasz Apache 2.4, możesz skorzystać z " DBD" mapa . Możesz wstawić zapytanie bezpośrednio do definicji mapy, pomijając konieczność użycia zewnętrznego skryptu. Używałbyś go w ten sam sposób.
RewriteMap item_lookup "fastdbd:SELECT id FROM items WHERE name = %s"
Następnie użyj go w ten sam sposób:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /item.php?id=${item_lookup:$1} [L]
Bez użycia zapytania DBD/FastDBD, myślę, że naprawdę lepiej jest po prostu przeszukać bazę danych z item.php
, ponieważ i tak byś zduplikował całą tę pracę w drugim zewnętrznym skrypcie. Po prostu dodaj coś takiego:
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]
I w twoim item.php
skrypt, sprawdź oba id i imię . Jeśli masz imię , wykonaj wyszukiwanie w bazie danych, aby zmienić to na identyfikator. Jest o wiele łatwiejszy w zarządzaniu, nie musisz mieć dostępu do konfiguracji serwera/vhosta i nie komplikujesz sprawy, używając mapy przepisywania.