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都必须在执行下一个RewriteRule之前评估为true。这条特定的行会在传入的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/ 以外的第三方外部服务