Mod重写生成404时抓取(在浏览器中查看时工作正常)

时间:2010-09-05 08:04:46

标签: php .htaccess mod-rewrite web-crawler

我的.htaccess中有以下代码:

RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

我的漂亮链接转换是在我的index.php上完成的。如果用户正在寻找不存在的内容,则会生成404标头,否则将显示内容。

这一切都很好,但是当爬虫或其他东西试图查看HTML时,他们会收到404错误。

例如:

http://www.jasonleodurbin.com/portfolio 该链接应该可以正常工作。

如果您尝试在HTML验证程序中验证它,则它不起作用。爬虫表示它正在获得404.我的Facebook份额也是如此。

我已尝试删除404错误标头,但我仍然遇到同样的问题。

这笔交易是什么?有什么建议吗?

编辑:

新的.htaccess:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^jasonleodurbin\.com$ [NC]
RewriteRule ^(.*)$ http://www.jasonleodurbin.com/$1 [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-z]+)/$ index.php?go=$1&app=1 [NC,L,QSA]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-z]+)?success=true index.php?go=$1&success=1 [NC,L,QSA]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-z]+) index.php?go=$1 [NC,L,QSA]

处理:

globals.php

if(!isset($_GET['go']) || $_GET['go'] == "") $_GET['go'] = "home";

的header.php

if(isset($_GET['go']) && !@fopen(strtolower($_GET['go']).".php",'r')){
    //header("HTTP/1.0 404 Not Found");
    define("FAIL",true);
    $_GET['go'] = "error";
}
else {
    define("FAIL",false);
Header('HTTP/1.1 200');
}
if(FAIL) define("GOSUB",DIR);
if(isset($_GET['app'])) define("GOSUB","../");
else define("GOSUB","");

我也尝试过这个用于index.php:

<?Header('HTTP/1.1 200 OK');?>
<? require_once("header.php");?>
<? require_once(strtolower($_GET['go'].".php"));?>

    </div>
</div>
<?
    if(!defined("FOOTER"))define('WP_USE_THEMES', false);
    define("FOOTER",true);
    include("blog/index.php");
?>
<!--[if IE]>
<a href='http://www.google.com/chrome' title='Get Google Chrome : A Better Way To Browse' class='noie sprite-1'>IE Sucks</a>
<![endif]-->
<!--[if lt IE 7]>
<div style='position:absolute;top:60px;left:0px;'><b>IE 6</b>?! Dude, upgrade. <br>Click the link above to get Google Chrome.</div>
<![endif]-->
</body>
</html>

在我发送200之前发送404的东西。

3 个答案:

答案 0 :(得分:1)

我确实显示了投资组合页面,带有404标题。因此,检查设置404标头的代码,错误就在那里。

在我看来,您只使用fopen查看文件是否存在(如果文件无法打开,则不存在)。使用file_exists()http://php.net/file_exists

答案 1 :(得分:1)

您似乎正在使用Wordpress。 Wordpress将任何找不到的页面设置为404。

您也可能对插件Link Juice Keeper感兴趣。它使用301重定向将所有404页面重定向到首页。这里是Wordpress 404 tips and tricks

答案 2 :(得分:0)

你确定代码中没有其他地方可能会发送另外404个吗?如果没有其他人发现,那么您的配置似乎是一个问题,请在页面获得批准时尝试发送相反的200 OK标题。

BTW没有fopen(strtolower($_GET['go']),用户可能会将$_GET['go']设置为http://his.domain.com/page,如果PHP的配置允许(allow_url_fopen,您最终会从他的服务器中包含一个页面})。