0

我的任务是让旧网站的 URL 变得“漂亮”

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

当前的网址是这样的:(我可以.php很容易地删除扩展名.htaccess

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

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

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

理想情况下,URL 应该是

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

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

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

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

  • 我想我能做到这一点吗?
  • 它会明确重写几乎所有可能的有效查询字符串可能性(可能多达几百个)
  • 我想这会导致一些性能问题,并且可能不是最佳实践。
  • 如果它是最简单的选择,那么只要它有效,我就可以接受它是草率和糟糕的做法。

2)创建一个控制器并重写所有查询,index.php这些查询将把这里的所有视图放在一起。

  • 这有点超出我的舒适区,但可能被认为是最佳实践?

该站点严重陈旧,并且组合不佳(1000 行自定义(非 OOP)php 行,有很多代码重复)就此而言,它实际上是 2 个不同的站点共享一个数据库,并且大部分代码库(第二个是前段时间使用原始代码库的复制粘贴创建的,并且已经分崩离析)


我的问题

  • 这些是可行的选择吗?我错过了任何选择吗?

  • 我应该采取哪种方法?

4

1 回答 1

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 规则中使用捕获组,如下所示:

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 的解决方案花费更多的时间,但知道这是一件好事,它是一种高效的解决方案,而且非常优雅。

您可以轻松生成基于文本的映射,然后使用 RewriteRule 中的映射,如下所示:

RewriteMap building_map txt:/etc/apache2/buildings.txt
RewriteRule ^/about/([^/]+)$ about.php?building-id=${building_map:$1|0} [NC,L]
于 2012-12-03T20:02:28.363 回答