是否可以使用mod_rewrite编写一个带有url参数值的htaccess规则(例如:id = 1,其中'id'是参数,'1'是参数值),查询数据库指定的参数值,然后将查询返回的值写为请求页面的url的一部分?
我知道mod_rewrite的基础知识,例如重写一个如下所示的网址:
www.example.com/item.php?id=1
以下内容:
www.example.com/item/1
我需要的一个例子是编写以下网址:
www.example.com/item.php?id=1
到此:
www.example.com/item/name-of-item-based-on-id-specified-in-original-url
但是我不知道我想要做什么是可以使用mod_rewrite。
如果有人能解决这个问题,如果你能帮助我,我将非常感激。如果我不想使用htaccess和mod_rewrite做什么,有人可以指点我如何解决这个问题吗?
答案 0 :(得分:4)
这是可能的,但您需要使用RewriteMap来定义可在RewriteRule
中使用的映射。
Apache 2.2版没有直接的数据库访问权限,因此您需要编写一个执行实际查询然后返回结果的脚本。您可以使用"External Rewriting Program"定义此地图。
因此,如果您有一个从stdin获取“cats”的脚本,然后查询数据库,并返回“1”,您可以这样定义:
RewriteMap item_lookup prg:/path/to/item_lookup.php
该指令必须在您的服务器或vhost配置中,它不能在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" map。您可以将查询直接插入到地图定义中,从而绕过必须使用外部脚本。你会以同样的方式使用它。
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 和名称。如果您有名称,请执行数据库查找以将其转换为ID。它更易于管理,您不需要具有服务器/虚拟机配置访问权限,并且您不会因使用重写映射而使问题复杂化。