在404上使用PHP和MySQL重定向301

时间:2009-04-14 15:27:09

标签: php mysql apache redirect http-status-code-301

我正在将一个500多页的大型静态网站转移到Joomla安装中,但我想要做的,而不是编写500多行.htaccess文件,是使用PHP内置的301头重定向动态重定向请求进入新网址。

例如,在我移动网站后,以下网址将为404而没有重定向 -

http://www.foo.com/old_page.html

我希望它重定向到

http://www.foo.com/old-page.php

所以我想创建一个旧URL的MySQL数据库及其相应的新URL,然后,如果服务器要返回404,首先要检查数据库是否有现有旧URL,如果匹配,发布301重定向到新URL。对,我在这里有道理吗?

我该怎么做?我可以“谈论”逻辑,但不确定从哪里开始或如何实现它,因为虽然我理解PHP,但我真的不明白它如何与Apache一起工作(或者即使它会例如......) ?

如果您知道任何已经执行此操作的脚本,那就更好了。

4 个答案:

答案 0 :(得分:5)

在Apache配置中,设置您喜欢的/404handler.php脚本的ErrorDocument。在其运行上下文中, $ _ SERVER ['REQUEST_URI'] 将是所请求的原始页面的URI。进行数据库查找,如果找到要重定向的页面,请使用标题(“位置:”。$ wherever)重定向到它。

答案 1 :(得分:1)

我能想到的最简单的方法是使用mod_rewrite(链接到一个很棒的介绍教程)将所有传入的请求重定向到单个PHP脚本(或使用一个标志,以便只重定向此重定向如果请求是针对不存在的文件的话,请求的地址作为查询字符串的一部分传递。从那里,让PHP脚本查找该请求应该去的地方,并重定向到它。

因此,如果有人试图打开http://www.foo.com/old_page.html,mod_rewrite会发送到类似http://www.foo.com/redirect.php?page=old_page.html的内容。然后redirect.php进行数据库查找以查看“old_page.html”的新地址是什么,并重定向到那里。

答案 2 :(得分:0)

为什么不将重定向放入带有旧URL的页面(即old_page.html),而不是创建数据库?

由于您显然是根据数据库条目逐个进行此操作,因此您可以根据具体情况对页面进行操作。

您可以编写一个快速perl脚本或任何您喜欢的内容,为您生成这些html页面,给出旧页面的名称和新页面的URL。

答案 3 :(得分:0)

您还可以使用RewriteMap

old_page new-page
# …

但您需要在httpd.conf(或虚拟主机配置)中定义该地图:

RewriteMap oldtonew txt:/path/to/file/map.txt

然后,您可以在.htaccess文件中使用该地图:

RewriteCond ${oldtonew:$1} .+
RewriteRule ^(.*)\.html$ /%0.html [L,R=301]