php – 是否可以使用URL中传递的值查询数据库,并使用mod_rewrite将查询结果写入URL?

是否可以使用mod_rewrite来编写一个带有url参数值的htaccess规则(例如:id = 1,其中’id’是参数,’1’是参数值),使用参数值查询数据库指定,然后将查询返回的值写为请求页面的URL的一部分?

我知道mod_rewrite的基础知识,例如重写一个如下所示的网址:

www.example.com/item.PHP?id=1

以下内容

www.example.com/item/1

我需要的一个例子是编写以下URL:

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无法实现我的目标,有人可以指点我如何解决这个问题吗?

解决方法:

这是可能的,但您需要使用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和name.如果您有名称,请执行数据库查找以将其转换为ID.它更容易管理,您不需要具有服务器/虚拟机配置访问权限,并且您不会通过使用重写映射使问题复杂化.

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...