这是可能的,但您需要使用RewriteMap来定义可以在RewriteRule
.
Apache 2.2 版没有直接的数据库访问权限,因此您需要编写一个执行实际查询然后返回结果的脚本。您可以使用“外部重写程序”定义此映射。
因此,如果您有一个从标准输入获取“cats”的脚本,然后查询数据库并返回“1”,您可以这样定义它:
RewriteMap item_lookup prg:/path/to/item_lookup.php
该指令必须在您的服务器或虚拟主机配置中,不能在 htaccess 文件中。但是您可以在 htaccess 文件中使用映射:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /item.php?id=${item_lookup:$1} [L]
所以这需要 URI/cats
并将其重写为/item.php?id=1
.
如果您使用的是 apache 2.4,那么您可以利用“DBD”映射。您可以直接在地图定义中插入查询,而不必使用外部脚本。你会以同样的方式使用它。
RewriteMap item_lookup "fastdbd:SELECT id FROM items WHERE name = %s"
然后以同样的方式使用它:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /item.php?id=${item_lookup:$1} [L]
在不使用 DBD/FastDBD 查询的情况下,我认为您最好只从 进行数据库查找item.php
,因为无论如何您都会在第二个外部脚本中复制所有这些工作。只需添加如下内容:
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]
在您的item.php
脚本中,检查id和name。如果您有name,请进行数据库查找以将其转换为 id。它更容易管理,您不需要拥有服务器/虚拟主机配置访问权限,并且使用重写映射不会使事情复杂化。