我们最近将一个网站从自定义 CMS 迁移到 drupal。为了保留用户收藏的一些链接(我们有大约 120 个重定向),我们希望将原始 URL 转发到新 URL。
我已经搜索了几天,但似乎找不到我需要的任何简单的东西。
我们有包含一个或多个查询字符串的现有 URL,例如:
/article.php?issue_id=12&article_id=275
我们想转发至新地址:
http://foobar.edu/content/super-happy-fun-article
我开始使用:
重写引擎开启 重写规则 ^/article\.php?issue_id=12&article_id=275$ http://foobar.edu/content/super-happy-fun-article [R=301,L]
但这并不管用。
一个简单的 RewriteRule 工作原理:
重写规则^test\.php$index.php
我不清楚如何将 {QUERY_STRING} 与多个
基本上,它是 120 个简单的重定向,从一个现有 URL 转到一个新 URL。我不需要范围 [0-9],因为现有 URL 没有顺序。
也许我可以做我需要的事情重写映射以及一个包含如下行的简单文本文件:
index.php?issue_id=12&articleType_section=0&articleType_id=65 http://foobar.edu/category/fall-2008
如果有人对使用 mod_rewrite 来实现这一点有任何想法,或者有更好或更简单的 mod,我也会接受。
谢谢!
答案1
为每个可能的过期链接制定重写规则并不是很有效。因此,最好的选择可能是向新链接发出 php 重定向。创建一个函数“generateLink”,该函数解析 $_REQUEST 并创建“新”链接,然后发出header("Location: $newLink", '', 301)
。在顶部调用 generateLink()文章.php,在生成任何输出之前(否则 header() 将失败)
答案2
如果您需要快速完成此操作,您是否不能只编写一个新的 article.php 来转发到正确的 drupal 页面?
<?php
$locations[12][275] = 'content/super-happy-fun-article';
$issue = $_GET['issue_id'];
$article = $_GET['article_id'];
if(isset($locations[$issue][$article]){
$go = $locations[$issue][$article];
}
else{
$go = 'broken_link'
}
header( 'Location: http://www.yoursite.com/'. $go );
答案3
RewriteRules(默认情况下)仅适用于 URL 部分,而不适用于查询部分(?后面的部分)。要构建根据查询部分触发的规则,您需要为查询字符串设置条件
RewriteCond %{QUERY_STRING} ^issue_id=12&article_id=275$
RewriteRule ^/article\.php http://foobar.edu/content/super-happy-fun-article [R=301,L]
获得您所要求的东西。
但是对于 120 个重定向,使用定制的 article.php 的想法更好。