如何告诉Apache忽略/阻止404错误并重定向到hander页面?

时间:2009-02-24 22:32:48

标签: apache seo http-status-code-404

概念

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

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

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

  1. 通过Apache查看没有包含相应URL的页面,并使用ErrorDocument 404 /redirect.php重定向到/redirect.php
  2. redirect.php剥离URL并在数据库中查找其条目。
  3. redirect.php从页面条目中回显HTML数据。
  4. 因为所有页面都是以层次结构(根据CMS)创建的,所以查找页面只是逐个搜索数据库直到找到最后一个页面。这样,www.mysite.edu/me/something/useful之类的网址会在useful中显示该条目,该条目是something的孩子,mepageid的孩子。所有页面HTML都存储在数据库中,因此一旦找到条目,通过PHP将其回显到页面就很简单了。

    旁注:我实际创建了一个新表,它存储了每个页面的完整网址并将其链接到Status: 404,因此搜索过程得到了很大改善,而一般的想法保持不变。

    问题

    在客户端,一切都令人震惊。但是,我注意到谷歌尚未为我们网站的大部分(任何)编制索引。基本上,它在我重新设计之前已经在某种程度上被编入索引,现在索引剩下的就是其URL保持不变的文件。

    我终于(今天)从Google网站站长工具获得了一些数据,这些数据表明它在我们的sitemap.xml中列出的网页上一直有404错误,但是,当我点击链接时,网页就会很好。这让我相信,虽然重定向工作正常,但Apache仍在发送Status: 404消息,这可能会促使Google的机器人停止处理和/或不对该页面编制索引。

    问题

    所有这些都考虑到了这个问题:

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

      提前致谢!

      编辑1:感谢alex将我介绍给firebug中的Net标签。因为我喜欢并且经常使用萤火虫,所以我确信这个新功能将在后来派上用场(阅读:目前正在研究它可以做的其他事情)。感谢您的帖子,我能够 确认 apt-get install apache2 mysql-server php5确实是需要解决的正确问题。现在问题是如何我禁止Apache发送此错误,只是根据需要重定向页面。

      根据要求,以下是我文件中的一些代码示例。有关配置文件的一点需要注意的是,我在Debian Etch上运行并通过“/etc/apache2/apache2.conf”进行安装,因此它们分散了一些,列出的那个的片段是我认为的唯一一个对这个问题有影响。因为它是一个大文件(669行),如果你想看到更多,请告诉我哪些部分会有用,我会把它包括在内。

      ... 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(); } ?>

      {{1}}

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

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

你能发布一些重定向到redirect.php的.htaccess吗?