【问题标题】:301 redirect with PHP and MySQL on 404在 404 上使用 PHP 和 MySQL 进行 301 重定向
【发布时间】:2010-10-19 09:18:16
【问题描述】:

我正在将一个包含 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 一起工作(或者即使它会例如......) ?

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

【问题讨论】:

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


    【解决方案1】:

    您也可以使用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]
    

    【讨论】:

      【解决方案2】:

      我能想到的最简单的方法是使用mod_rewrite(链接是一个很棒的介绍教程)将所有传入请求重定向到单个 PHP 脚本(或使用一个标志,以便仅在request 用于一个不存在的文件),请求的地址作为查询字符串的一部分传递。从那里,让 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”的新地址是什么,然后重定向到那里。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

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

          由于您显然是在逐个处理数据库条目的基础上执行此操作,因此您可以对页面逐个执行此操作。

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

          【讨论】:

            猜你喜欢
            • 2014-12-20
            • 2014-05-08
            • 2015-03-20
            • 2012-03-10
            • 2020-03-28
            • 1970-01-01
            • 1970-01-01
            • 2012-04-13
            • 1970-01-01
            相关资源
            最近更新 更多