2

这个概念

所以,我已经用每个人都喜欢的自己的内容管理系统(CMS)制作(实际上升级了)这个网站。与大多数 CMS 一样,默认行为是带有丑陋且完全无用的 url 的访问页面,如下所示:

www.mysite.edu/index.php?pageid=xxxx

所以我们的想法是改变它,这样我们就可以拥有“真实”的 URL,这些 URL 不仅看起来更好,而且有望与 Google 搜索引擎更好地协作。改变真的没有那么难:

  1. 通过 Apache 看到没有具有相应 URL 的页面,并使用 ErrorDocument 404 /redirect.php 重定向到 /redirect.php
  2. redirect.php 剥离 URL 并在数据库中找到它的条目。
  3. redirect.php 从页面条目中回显 HTML 数据。

因为所有页面都是在分层结构中创建的(根据 CMS),所以查找页面只需逐个子项搜索数据库,直到找到最后一个。这样一来,诸如 URL 之类的 URLwww.mysite.edu/me/something/useful会调出一个条目,该条目useful是. 所有页面 HTML 都存储在数据库中,因此一旦找到条目,通过 PHP 将其回显到页面是一件简单的事情。somethingme

旁注:我实际上创建了一个新表,它存储每个页面的完整 URL 并将其链接到它pageid,因此搜索过程得到了很大改进,而总体思路保持不变。

问题

在客户端,一切都运行得非常好。然而,我注意到谷歌还没有索引我们网站的很多(任何)。基本上,在我重新设计它之前,它已经在某种程度上被索引了,现在索引剩下的就是那些 URL 保持不变的文件。

我终于(今天)从 Google Webmaster Tools 获得了一些数据,显示它在我们的 sitemap.xml 中列出的页面上不断出现 404 错误,但是,当我点击链接时,页面就正常了。这让我相信,虽然重定向运行良好,但 Apache 仍在发送一条Status: 404消息,可能会提示 Google 的机器人停止处理和/或不索引页面。

问题

所以考虑到这一切,问题是这样的:

  1. 有没有办法首先确认 Apache 仍在发送Status: 404消息?
    • 回答:是的!
  2. 有没有办法让它在仍然重定向到 /redirect.php 的同时停止

提前致谢!

编辑 1: 感谢 alex 向我介绍了 firebug 中的 Net 选项卡。由于我非常喜欢和使用 firebug,我相信这个新功能在以后会派上用场(阅读:目前正在研究它可以做的其他事情)。感谢您的帖子,我已经能够确认Status: 404确实是需要解决的正确问题。现在的问题具体是如何禁用 Apache 发送此错误并在需要时简单地重定向页面。

根据要求,这是我文件中的一些代码示例。关于配置文件需要注意的一件事是,我在 Debian Etch 上运行并通过“ apt-get install apache2 mysql-server php5”安装,因此它们分散了一点,而列出的文件的片段是我认为唯一对此有影响的文件问题。由于它是一个大文件(669 行),如果您想查看更多内容,请告诉我哪些部分有用,我将包含它。

/etc/apache2/apache2.conf

...
ErrorDocument 404 /redirector.php
...

/etc/apache2/apache2.conf- 空白文件

/www-root/redirector.php

<?php
//get the URL string after server id.
//    e.g. www.mysite.edu/page returns "/page"
$pageReq = preg_replace("/\/$|\.php$|\.html?$/","",$_SERVER['REQUEST_URI']);

if(substr($pageReq,0,5)=='/wiki') {    //am I redirecting to the wiki app
    include "mewiki/wiki.php";
} else {                                //rest of site - what google will see
    if($pageReq=='')                    //most site looks like /ME/something
        $pageReq = '/ME';               //this fixes index to be appear as /ME
    include "config.php";

    //query the database for pageid
    mysql_connect($meweb['host'],$meweb['user'],$meweb['pass']);
    mysql_select_db($meweb['database2']);
    $qPageReq = mysql_query("SELECT pageid FROM url_redirects WHERE ".
                                "url='".$pageReq."'".
                                "ORDER BY updated DESC LIMIT 1");
    if($qPageReq) {
        //query database for actual page
        $pageid = mysql_fetch_assoc($qPageReq);
        $qPage = mysql_query("SELECT * FROM pages WHERE pageid=".
                                                $pageid['pageid']);
            if($qPage) {
                //createPage() is in page_loader.php.  It actually does a lot
                include "page_loader.php";
                createPage(mysql_fetch_assoc($qPage));
            }
    }
    mysql_close();
}
?>
4

2 回答 2

3

您需要发送 OK 标头,添加header('HTTP/1.1 200 OK')到您的代码中。

于 2009-02-25T09:29:31.287 回答
1

您可以使用 Firebug 来查看它是否正在发送 404 标头。使用网络选项卡。如果是 404ing,则页面的 GET 将显示为红色。或者,您可以使用 Live HTTP 标头。这些仅适用于 Firefox。

您可以发布一些重定向到redirect.php 的.htaccess 吗?

于 2009-02-24T23:16:29.777 回答