2

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

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

例如:

www.example.com/?category=1

将显示为:

www.example.com/software

尽管

www.example.com/?category=2

将显示为:

www.example.com/software/desktop

从我读到的内容来看,我应该研究一个 apache rewritemap,这就是我的困惑所在。我真的不想从一个平面 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”上; 基本上美化链接并使其更具可读性。唯一的事情是,我正在尝试从数据库中读取它

4

2 回答 2

1

如果您无权访问服务器或虚拟主机配置,则RewriteMap无论如何都无法使用。地图本身需要在服务器或虚拟主机配置中定义,而不是在 htaccess 文件中。但是 apache 2.4 可以选择使用 mod_dbd 来使用SQL 查询来定义重写映射

如果您需要访问 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 脚本会进行查找。

于 2013-04-02T07:48:52.783 回答
0

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

如果您mod_dir启用了 Apache(很有可能),您可以在 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 路由控制器可用,因此您无需重新发明轮子(大多数现代框架都有某种路由概念)。

于 2013-04-02T16:05:32.023 回答