阅读时间 4 分钟 (877 字)

死链漫步

Dead Links Walking

这是一个关于过去如何追赶马丁·拉贾和我,以及我们如何打败它的故事。

"嘿!这个链接已经失效了!"

在任何情况下,升级后听到这句话都不是你想要听到的。而且这次的情况远远不是最好的。地址栏中的链接完全混乱,根本不像是链接。

链接是从哪里来的?很好。这是一个来自非常旧格式的链接,包含"task=view"作为Joomla显示页面的提示。旧。真的旧。

但新闻越来越糟。这个链接今天还在通过电子邮件发送,而且这个链接应该在我们发送后整整一年内为客户工作。这让我们面临两个选择:修复电子邮件并设法让这个旧的链接工作,或者只是修复发出的电子邮件,然后等待整整一年再迁移离开Joomla 1.5。显然,后者不能认真对待。

该怎么办?这似乎是apache的mod_rewrite处理的一个简单任务,所以我们从这里开始。我们的前几次尝试失败了,而且据谷歌所说,显然没有人以前做过这件事。

朋友们建议我们为此目的编写一个自定义路由插件,但现在挑战已经摆在我们面前;我们要说服apache这样做。我们轮流解决这个问题,每次尝试都让我们更接近成功,但最终还是失败了。是我的共同作者马丁找到了最后缺失的部分。

我们最初的想法是构建一个完整的正则表达式来将"view=article"替换为"task=view",但经过几次尝试后没有成功,我们简化了任务:实际上我们不需要删除任务参数,因为Joomla只会忽略它;我们只需要添加视图参数。这样做触发了apache的循环倾向;虽然这花费了我们调试的时间,但也最终揭示了解决问题的关键。

我们的最终解决方案只有三行mod_rewrite。请随意根据您自己的目的进行实验;它解决了我们的问题(我们只有要显示这些链接的内容项),虽然我们的可能不适合您的情况,但我们使用的方法应该能引导您找到您的解决方案。

要完全理解这一点,你需要掌握Apache的mod_rewrite以及正则表达式的用法。其他人已经写了很好的介绍,因此,为了避免重复,我将直接向您推荐Apache的mod_rewrite文档正则表达式介绍

掌握这些知识后,戴上你的安全帽,让我们一起探索重写代码。

RewriteCond %{QUERY_STRING} ^(.*)task=view(.*)$

RewriteCond指令设置了重写发生的条件。每个RewriteCond都必须评估为true,然后下一个RewriteRule才会执行。这条特定的行如果传入的URL中包含"task=view",则会评估为true。(^代表字符串的开始,$代表字符串的结束。"."匹配任何字符,"*"重复匹配任意数量的字符,因此这个表达式处理整个字符串。)

RewriteCond %{QUERY_STRING} !(view=article)

这条线是解决问题的关键。Apache喜欢循环;如果它进行了修改,就会重复。当我们只尝试将新术语添加到字符串中时,这一点变得非常明显。如果没有这条线,它会无限循环,锁定服务器。(或者如果Apache没有认识到它对循环的依赖,它会这样。相反,Apache会说"不,我不会去那里",并简单地拒绝执行可能引起循环的重写。)这种特性在我们之前的几次尝试中让我们陷入了困境。这条线就是为了防止这种情况;如果查询字符串中存在"view=article"参数("!"表示否定),则此测试返回false,我们退出此重写集,消除循环。

RewriteRule ^.*$ /$0?%1view=article%2 [R=301,L]

这就是工作的地方。行的第一部分("^.*$")简单地选择传入的整个URI。第二部分创建新的、重写的请求。$0取规则第一部分选择的字符串,并在其后放置"/",给我们"index.php"的URI。
%1和%2称为回溯引用,它们引用第一个RewriteCond中围绕"task=view"的两个部分--这把它们移动到围绕"view=article"。

方括号内的两个参数("R=301"和"L")标记了最终的处理:进行301重定向,并使这是此规则集的最后一个操作。

这重新构造了原始请求,以适应今天Joomla的文章请求的形式,这正是我们所需要的。

虽然这个重写规则适用于我们有限的情境,但它不足以处理Joomla 1.0的每个可能请求。但即使它不足以满足您的需求,它也可以用作创建适合您需求的重写的指南。

《Joomla社区杂志》上发布的一些文章代表了作者对特定主题的个人观点或经验,可能并不与Joomla项目官方立场一致。

0
Joomla 3. 为开发者带来什么新功能。实用时间...
使用工具进行LESS操作
 

评论

已经注册? 在此登录
尚未发表评论。成为第一个发表评论的人

通过接受,您将访问由 https://magazine.joomla.net.cn/ 外部的第三方提供的服务