使用mod_rewrite使用变量重定向70多个URL

时间:2009-10-24 16:05:15

标签: apache mod-rewrite variables

我正在构建一个webcomic网站,但章节顺序发生了重大变化。我已经以这样的形式手动为自己编写了转换:

  

36 - > 26.1

     

37 - > 28

     

38 - > 28.1

     

39 - > 29

     

40 - > 30

     

41 - > 30.1

基本上,按照本指南,我想将http://www.domain.com/view.php?chapter=38之类的所有网址转换为http://www.domain.com/c28.1这样的新网址。

我还想确保请求页码的人(例如view.php?chapter=38&page=4)将他们的页码传递给重定向,如下所示:c28.1/p4.html

看起来很简单,除了我有70左右的这些实现,并且有点担心,如果这显着伤害网站性能(70很多..?)并且无法获得漫画和页面要正确重写的变量。

所以我的问题是,我如何实现这一目标,我最好的解决方案是什么?如果性能没有问题,我宁愿将其与我的其他mod_rewrite代码保存在.htaccess中,但是如果唯一合理的方法是编写.php脚本并调用它来进行重定向,我可以这样做 - 虽然我真的不知道如何让PHP这样做。

请记住,所提到的70个左右是我唯一拥有的,所以我不打算建立一个易于访问的数据库。我只是想让重定向工作最小化。

如果有任何回应,我将非常感激。如果有人能帮我解决这个问题,请提前致谢。

2 个答案:

答案 0 :(得分:0)

我认为接近的一种较轻的方式(就.htaccess文件中的行而言)就像你提到的那样,使用.htaccess来处理网址,如:

RewriteRule ^c([0-9]+)$ view.php?chapter=$1  
RewriteRule ^c([0-9]+).([0-9]+)$ view.php?chapter=$1&section=$2  
RewriteRule ^c([0-9]+).([0-9]+)/p([0-9]+).html$ view.php?chapter=$1&section=$2&page=$3

然后将它们映射到将处理单个内​​容的php脚本。

我可以建议你也应该通过rewriterule映射所有旧网址的301重定向,以便允许来自搜索引擎serp的人重定向到内容的正确新网址。 / p>

希望这有帮助。

答案 1 :(得分:0)

我最终咨询了freenode #httpd的优秀人才,并得到了解决方案。对我来说,因为我只想捕获对view.php的请求,我发现它只是编写了一个从数组中收集东西的view.php脚本。不需要mod_rewrite。我现在使用的脚本如下:

<?

$chapters = array(
    // old => new
    1   => 2,
    2   => 3,
    3   => 4,
    10  => 21
);

if (! isset($_GET['chapter']) || ! isset($chapters[$chapter = (int)$_GET['chapter']])) {
    header('HTTP/1.1 404 Not Found');
    echo 'Page Not Found';
    exit;
}

$url = '/c' . $chapters[$chapter];
if (isset($_GET['page']))
    $url .= '/p' . $_GET['page'] . '.html';

header('Location: ' . $url, 301);

?>

感谢您的帮助,gh3。