1

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

因此,例如,在我移动站点后,以下 URL 将 404 没有重定向-

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

我希望它重定向到

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

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

我该怎么做?我可以“谈论”逻辑,但不确定从哪里开始或如何完成它,因为虽然我了解 PHP,但我并不真正了解这将如何与 Apache 一起工作(或者即使它会例如......) ?

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

4

4 回答 4

5

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

于 2009-04-14T15:31:45.273 回答
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”的新地址是什么,并重定向到那里。

于 2009-04-14T15:34:37.950 回答
0

与其创建数据库,不如直接将重定向放入具有旧 URL(即 old_page.html)的页面中?

由于您显然是对数据库条目逐个执行此操作,因此您可以对页面逐个执行此操作。

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

于 2009-04-14T15:29:13.670 回答
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]
于 2009-07-18T17:04:33.090 回答