É possível, mas você precisa usar um RewriteMap para definir um mapeamento que você pode usar em uma
RewriteRule
. O Apache versão 2.2 não tem acesso direto ao banco de dados, então você precisará escrever um script que faça a consulta real e retorne o resultado. Você pode definir este mapa usando o "External Rewriting Program" .
Então, se você tem um script que pega "cats" de stdin, consulta o banco de dados e retorna "1", você o definiria assim:
RewriteMap item_lookup prg:/path/to/item_lookup.php
Essa diretiva deve estar na configuração do seu servidor ou vhost, não pode estar em um arquivo htaccess. Mas você pode usar o mapeamento em um arquivo htaccess:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /item.php?id=${item_lookup:$1} [L]
Então isso leva o URI
/cats
e reescreve isso para /item.php?id=1
. Se você estiver usando o apache 2.4, poderá aproveitar o " DBD" mapa . Você pode inserir uma consulta diretamente na definição do mapa, ignorando a necessidade de usar um script externo. Você usaria da mesma forma.
RewriteMap item_lookup "fastdbd:SELECT id FROM items WHERE name = %s"
Em seguida, use-o da mesma maneira:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /item.php?id=${item_lookup:$1} [L]
Sem usar uma consulta DBD/FastDBD, acho que você honestamente é melhor apenas fazer a pesquisa de banco de dados de
item.php
, já que você estaria duplicando todo esse trabalho em um segundo script externo de qualquer maneira. Basta adicionar algo como: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 no seu
item.php
script, verifique os dois id e nome . Se você tiver um nome , faça a pesquisa no banco de dados para transformá-lo em um id. É muito mais fácil de gerenciar, você não precisa ter acesso à configuração do servidor/vhost e não está complicando as coisas usando um mapa de reescrita.