【发布时间】:2012-03-21 16:40:32
【问题描述】:
我们以前的网站管理员设置了这个网站,他设置的缓存适用于大多数浏览器,但我发现某些版本的 Opera 和一些在线 SEO 工具(如 Submit Express Analyzer)不起作用。我怀疑这是标题的问题。我已经阅读过有关 ob_start("ob_gzhandler") 的信息,但我不确定如何在这种情况下实现它。
站点全部由路由器文件、每种页面类型的唯一控制器文件和 .htaccess 控制。在路由器文件中,设置了以下代码以查找页面的缓存版本并加载内容,否则,加载页面。
缓存使用 gzencode 压缩页面内容,并使用 uri 哈希将其存储在数据库中的缓存表中。如果缓存文件存在,则从数据库中提取内容。
Opera 显示一个空白页面,并且提交快速测试无法识别页面。我几乎可以肯定 .htaccess 文件与该问题无关。下面的代码是我认为问题所在。
<?php
$loadTime = microtime(true);
session_start();
if (!isset($_SESSION['var']))
$_SESSION['var'] = rand(0, 2);
if (!isset($_SESSION['var2']))
$_SESSION['var2'] = rand(0, 4);
require(dirname(__FILE__).'/config/common.php');
$uri = $_SERVER['REQUEST_URI'];
$request = explode('/', substr($uri, 1));
$request = preg_replace('/\..*/', '', $request);
$uriHash = sha1($uri);
if($uri == '/') //This is the Index...
{
不相关的索引代码
}
try
{ // LOOKS FOR CACHE IN DB BASED ON URI
$cache = $GLOBALS['db']->getRow("SELECT * FROM cache_tbl WHERE uri_hash = '$uriHash'");
}catch ( Exception $e ) {
$cache = array();
}
if ( !empty($cache) && ($cache['mod_date'] * 60 * 60 * 24) > $loadTime )
{ // IF NO CACHE IN DB, SETS HEADERS FOR COMPRESS OR NO COMPRESS
$HTTP_ACCEPT_ENCODING = $_SERVER["HTTP_ACCEPT_ENCODING"];
if( headers_sent() )
$encoding = false;
else if( strpos($HTTP_ACCEPT_ENCODING, 'x-gzip') !== false )
$encoding = 'x-gzip';
else if( strpos($HTTP_ACCEPT_ENCODING,'gzip') !== false )
$encoding = 'gzip';
else
$encoding = false;
$compressed = $cache['contents'];
if ( $encoding ) {
header("Content-Encoding: ".$encoding);
echo $compressed;
}
} else {
if ($request[0] == 'venues') {
header("HTTP/1.1 301 Moved Permanently");
header('Location: '.HOST.$request[1].'.html');
}
更多代码
if ( // Irrelevant Conditions ) {
$contents = ob_get_clean();
echo $contents;
$compressed = gzencode($contents, 7);
try {
Admin::add('cache_tbl', array('uri_hash' => $uriHash, 'contents' => $compressed, 'mod_date' => $loadTime));
} catch(Exception $e) { ; }
ob_end_flush();
}
}
这个文件中发生了很多事情,我试图删掉尽可能多的内容以消除混乱。任何帮助显然都非常感谢!提前致谢!
【问题讨论】:
-
您是否考虑提供一个在其他浏览器中显示正常但在 Opera 中失败的链接?
-
抱歉,我不能……出于保密原因。
-
Welp,这很可能是 HTTP 错误。一些 HTTP 客户端(浏览器)比其他客户端更宽容。
-
我刚刚看到大部分代码都是基于php.net上的一个示例