使用rewritemap和mysql重写url参数

时间:2013-04-02 06:25:15

标签: php mysql .htaccess mod-rewrite rewritemap

我意识到这个问题已经被很多人问到了这个问题,但大多数答案似乎是针对一个非常特殊的案例,只能满足他们的需求,到目前为止我还没有找到合适的解决方案(至少,据我所知)。

我的问题是我试图让我的网站将URL参数从ID重定向到实际的字符串。

例如:

www.example.com/?category=1

将显示为:

www.example.com/software

,而

www.example.com/?category=2

将显示为:

www.example.com/software/desktop

从我读过的内容来看,我应该查看一个apache重写映射,这就是我的困惑所在。我真的不需要从平面的txt文件加载,因为我'我希望尽可能让它变得动态,我已经读过我可以从php文件中读取它并从MySQL数据库中读取它,这就是我想要的。

问题在于我真的不太确定实现这个目标的正确方法。 RewriteMap文档只涉及平面.txt文件,而不是用MySQL实现。

所以基本上我要问的是,如果有人能解释如何实现我正在寻找的东西,或者至少指出我正确的方向。到目前为止,我发现的大多数线程都遗憾地没有太多帮助,但是我可能已经通过了有用的线程。

如果它有帮助,那么我的MySQL数据格式化为继承结构,如下所示:

 ID |   Title          |   Link             | Parent
  1 | Software         | /Software/         |  NULL
  2 | Desktop Software | /Software/Desktop/ |   1
  2 | Mobile Software  | /Software/Mobile/  |   2

PS: 我应该补充一点,我发现的大多数解决方案都以此为例:

  RewriteMap examplemap prg:/path/to/file.php
  RewriteRule (.*) ${examplemap:$1}

然而,它从未提供有关该file.php中的内容以及查询和返回值的信息。

修改 我应该提一下,我在共享托管服务器上,而不是我自己的私有服务器,因此我可能无法访问所有可能的选项

编辑2 仅为了清楚起见: 我要做的是让访问'example.com/software'的用户被视为'example.com/?category=1';基本上使链接变得漂亮并使其更具可读性。唯一的问题是,我正试图从数据库中读取它

2 个答案:

答案 0 :(得分:1)

如果您无权访问服务器或vhost配置,则无论如何都无法使用RewriteMap。映射本身需要在服务器或vhost配置中定义,而不是在htaccess文件中定义。但是apache 2.4可以选择使用mod_dbd来使用SQL query to define a rewrite map

如果你需要访问MySQL,你可能最好用PHP来完成所有这些,而不是使用mod_rewrite。您将使用mod_rewrite路由到您的php文件,然后重定向。也许是这样的?

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /file.php?link=$1 [L]

因此,当有人请求http://example.com/Software/Mobile/时,请求会被重写为:/file.php?link=Software/Mobile/,您的 file.php 脚本会进行查找。

或者,如果你的意思是相反:

RewriteCond %{QUERY_STRING} category=([0-9]+)
RewriteRule ^$ /file.php?ID=%1 [L]

因此当有人请求http://example.com/?category=2时,请求会被重写为:/file.php?ID=2并且php脚本会进行查找。

答案 1 :(得分:0)

我的建议是考虑使用前端控制器模式。我认为,一旦你开始进入用户友好的URL或“路由”的概念,前端控制器可以真正简单的事情,因为你不再需要担心将特定的URL映射到Web服务器级别的特定控制器。

如果您启用了Apache mod_dir(很可能),您可以在Apache配置或.htaccess中执行类似的操作:

FallbackResource /index.php

这个简单的指令将指示任何可能导致404错误的请求被定向到/index.php的前端控制器。

这也可以通过mod_rewrite完成,如下所示:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php [L,QSA]

在前端控制器中,您可以评估URI并将请求路由到处理请求的任何逻辑。您可以通过查找来自数据库或硬编码路由数组或其他任何路径的路径来完成此操作。 (但我建议,如果使用数据库,则可以使用可用于快​​速访问的路由的缓存版本。)

有许多不同的PHP路由控制器,您无需重新发明轮子(大多数现代框架都有某种路由概念)。