我的任务是将旧网站的网址设为“漂亮”
这是一个房地产网站,有几十栋建筑物,可能有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
文件
2)创建一个控制器并将所有查询重新提交给index.php
,这些查询会将所有视图放在一起。
该网站非常陈旧,并且很难放在一起(1000多行自定义(非OOP)php与大量代码重复)就此而言,它真正有2个不同的站点共享一个数据库,而且大多数代码库(第二次是在前一段时间创建的,带有原始代码库的复制粘贴,并且已经分开了)
我的问题
这些可行的选择是否我想念任何替代方案?
我应该采取哪种方法?
答案 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]