如何使用数据库值更改旧php站点上的URL结构?

时间:2012-12-03 18:27:52

标签: php .htaccess url-rewriting url-routing

我的任务是将旧网站的网址设为“漂亮”

这是一个房地产网站,有几十栋建筑物,可能有100个公寓房源。

当前网址如下:(我可以使用.php轻松删除.htaccess扩展程序

example.com/about?building-id=65
example.com/about?apartment-id=35

它变得比这复杂得多,有一些搜索页面,不同的列表视图,一个联系表单页面,它被发送一个建筑物或apt id来预先填写表格和一些信息等等......

但是对于这个例子......

理想情况下,网址应为

example.com/about/building-name/
example.com/about/building-name/apartment-name

建筑物名称和公寓名称都是存储在数据库中的值,其中id为s作为主键。

在研究了这个问题后,我确定了几种不同的方法

1)在管理员更改时动态生成.htaccess文件

  • 我想我能做到这一点吗?
  • 它会明确地重写几乎所有可能的有效查询字符串的可能性(可能高达几百)
  • 我认为这会导致一些性能问题,而且可能不是最佳做法。
  • 如果它是最简单的选择,只要它有效,我就会很邋and和糟糕的做法。

2)创建一个控制器并将所有查询重新提交给index.php,这些查询会将所有视图放在一起。

  • 这有点偏离我的舒适区,但可能被认为是最佳做法?

该网站非常陈旧,并且很难放在一起(1000多行自定义(非OOP)php与大量代码重复)就此而言,它真正有2个不同的站点共享一个数据库,而且大多数代码库(第二次是在前一段时间创建的,带有原始代码库的复制粘贴,并且已经分开了)


我的问题

  • 这些可行的选择是否我想念任何替代方案?

  • 我应该采取哪种方法?

1 个答案:

答案 0 :(得分:2)

.htaccess文件的实际生成不会成为问题。我的意思是,将500或1000行文本写入文件并不是什么大问题。但是,由于引擎会针对每个HTTP请求针对每个规则检查所请求的URL,因此众多规则实际上很可能会给性能带来影响。它可能不是一个非常大的性能影响,但它似乎浪费我。请注意,Apache,AFAIK没有对.htaccess重写规则或重定向进行优化,即它不会从小正则表达式中构建一个大的正则表达式等。

选项2,在PHP中解析请求,实际上工作量较少,我认为,特别是对于一个庞大的非OOP站点。

考虑一下这样的片段:

$uri = explode('/', $_SERVER['REQUEST_URI']);
if($uri[0] == 'about') {
    $id_aray = lookup_building_and_apartment_by_name( $uri[1], $uri[2] );
    $_GET['building_id'] = $id_array['building'];
    $_GET['apartment_id'] = $id_array['apartment'];
    include('about.php');
} 
else if($uri[0] == 'something_else') {
    // something else.
}
else {
    // 404
}

这样的逻辑可以很好地作为一个控制器,它不是一个很大的工作。

或者,您可以在每个入口点的顶部放置一个URI解析器代码段。比如,在about.php的顶部:

$uri = explode('/', $_SERVER['REQUEST_URI']);
$id_aray = lookup_building_and_apartment_by_name( $uri[1], $uri[2] );
$_GET['building_id'] = $id_array['building'];
$_GET['apartment_id'] = $id_array['apartment'];

这将使您能够以增量方式工作,一次一个子页面,旧链接也可以继续工作。


主要是为了记录:有一个选项3,你可以在mod_rewrite规则中使用capture groups,如下所示:

RewriteRule ^/about/([^/]+)/([^/]+)$ about.php?building_name=$1&apt_name=$2 [NC,L]
RewriteRule ^/about/([^/]+)$ about.php?building_name=$1 [NC,L]

(这可以通过单一规则来完成,但是这样阅读和编写起来要容易得多。)这仍然要求你在about.php中有一个基于php的翻译,但是有一个优点,你可以放httpd.conf中的这些规则。

还有一个选项4:RewriteMap。它是一个非常棒的强大工具,如果你能够应对Apache手册的简洁性,它可能就是你的选择。学习使用它可能比使用基于PHP的解决方案花费更多的时间,但是知道它是一件好事,它是一种有效的解决方案,并且它非常优雅。

您可以轻松生成text-based mapping,然后使用RewriteRule中的映射,如下所示:

RewriteMap building_map txt:/etc/apache2/buildings.txt
RewriteRule ^/about/([^/]+)$ about.php?building-id=${building_map:$1|0} [NC,L]