nginx的error_page,有两个种办法。
一是直接error_page 502 503 504 = http://xyfunds.cdn.21vokglb.cn/index.htm;
二是error_page 502 503 504 =200 @fetch;然后location ~* @fetch {……}。
网上看到很多自定义error_page的方式,比如error_page 404 /404.php;把变量都传给php去分析处理;也可以在location里用if(){}做rewrite等等。
squid的error_page,可以有error_directory、error_map、deny_info三种方式。其中deny_info仅适用于ERR_ACCESS_DENIED一种情况;目前对于源站故障跳转,采用的是修改error_directory里html的meta;今天由nginx的方式想到采用error_map试试,于是写了如下php页面:
<?php
switch ($_SERVER['SERVER_NAME'])
{
case 'www.xyfunds.com.cn':
header("Location: http://xyfunds.cdn.21vokglb.cn/index.htm");
break;
default:
echo $_SERVER['SERVER_NAME'];
}
?>
但测试结果,ERR的页面却是一片空白……在squid.conf,default中看到,原来error_map只是返回定义页面的内容,header还是原先的。 于是又想针对squid返回的%U,进行strtr(),然后再进行meta,如下:
<?php
$urlarray = array('com.cn'=>'21vokglb.cn');
$urlrewrite = strtr("%U",$urlarray);
echo <META HTTP-EQUIV="refresh" CONTENT="0; $urlrewrite">;
?>
很可惜,测试结果是把这串字符直接显示在了页面上。 这两个结果让我很无语。如果说squid不支持php,那为什么它能识别出来上一个是修改header而不是页面内容所以不显示文本;如果说squid支持php,那为什么下一个又无法执行呢?
想对%U进行操作,难道非得到squid/src/errorpage.c里去修改么?C语言的字符串处理没有封装好的函数,真的好麻烦的说……