【问题标题】:Is it possible to query a database using a value passed in a URL, and write the result of the query to the URL using mod_rewrite?是否可以使用 URL 中传递的值查询数据库,并使用 mod_rewrite 将查询结果写入 URL?
【发布时间】:2013-09-08 09:57:32
【问题描述】:

是否可以使用mod_rewrite写一个带url参数值的htaccess规则(例如:id=1,其中'id'是参数,'1'是参数值),用指定的参数值,然后将查询返回的值写入请求页面的url中?

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

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

【问题讨论】:

  • 你想要的结果是什么?举个例子。
  • 谢谢@TobiasKun...我现在提供了一个例子。

标签: php mysql apache .htaccess mod-rewrite


【解决方案1】:

这是可能的,但您需要使用RewriteMap 来定义可以在RewriteRule 中使用的映射。

Apache 2.2 版没有直接的数据库访问权限,因此您需要编写一个执行实际查询然后返回结果的脚本。您可以使用"External Rewriting Program" 定义此映射。

因此,如果您有一个脚本从标准输入中获取“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" 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。如果您有 name,请进行数据库查找以将其转换为 id。它更容易管理,您不需要拥有服务器/虚拟主机配置访问权限,并且使用重写映射不会使事情复杂化。

【讨论】:

  • 这是一个非常简洁的功能。不知道这件事。这是对 mysql-injections 的保存吗?
  • @TobiasKun 仅当您在外部程序中进行清理时,否则,是的,您可以将 sqli 插入 DBD 查询。
  • @TobiasKun 更具体地说,mod_dbd goes over some of the issues 与 sqli
猜你喜欢
  • 1970-01-01
  • 2012-10-09
  • 2011-06-03
  • 2012-09-23
  • 1970-01-01
  • 2020-11-23
  • 2017-11-02
  • 2018-03-22
相关资源
最近更新 更多