这个概念
所以,我已经用每个人都喜欢的自己的内容管理系统(CMS)制作(实际上升级了)这个网站。与大多数 CMS 一样,默认行为是带有丑陋且完全无用的 url 的访问页面,如下所示:
www.mysite.edu/index.php?pageid=xxxx
所以我们的想法是改变它,这样我们就可以拥有“真实”的 URL,这些 URL 不仅看起来更好,而且有望与 Google 搜索引擎更好地协作。改变真的没有那么难:
- 通过 Apache 看到没有具有相应 URL 的页面,并使用 ErrorDocument 404 /redirect.php 重定向到 /redirect.php
- redirect.php 剥离 URL 并在数据库中找到它的条目。
- redirect.php 从页面条目中回显 HTML 数据。
因为所有页面都是在分层结构中创建的(根据 CMS),所以查找页面只需逐个子项搜索数据库,直到找到最后一个。这样一来,诸如 URL 之类的 URLwww.mysite.edu/me/something/useful
会调出一个条目,该条目useful
是. 所有页面 HTML 都存储在数据库中,因此一旦找到条目,通过 PHP 将其回显到页面是一件简单的事情。something
me
旁注:我实际上创建了一个新表,它存储每个页面的完整 URL 并将其链接到它pageid
,因此搜索过程得到了很大改进,而总体思路保持不变。
问题
在客户端,一切都运行得非常好。然而,我注意到谷歌还没有索引我们网站的很多(任何)。基本上,在我重新设计它之前,它已经在某种程度上被索引了,现在索引剩下的就是那些 URL 保持不变的文件。
我终于(今天)从 Google Webmaster Tools 获得了一些数据,显示它在我们的 sitemap.xml 中列出的页面上不断出现 404 错误,但是,当我点击链接时,页面就正常了。这让我相信,虽然重定向运行良好,但 Apache 仍在发送一条Status: 404
消息,可能会提示 Google 的机器人停止处理和/或不索引页面。
问题
所以考虑到这一切,问题是这样的:
- 有没有办法首先确认 Apache 仍在发送
Status: 404
消息?- 回答:是的!
- 有没有办法让它在仍然重定向到 /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();
}
?>