由于虚拟主机的不支持,所以就产生了用404实现伪静态的这个想法?
为什么要实现为静态呢,这个就不多说了,这是SEO的需要,网上很多说,搜索引擎对动态地址的收录其实已经挺好,的确,我不否认,但是毕竟URL的形式决定了它的权重,动态URL权重轻,所以我还是伪静态算了。
采用伪静态并非全静态难,而是因为全静态后,多余代码多,占用空间大,对于那些草根站长来说,这很要命。
下面是404.PHP的代码,这是草稿,存在纰漏。适用于APACHE和IIS下:
# 根据url返回实际页面并设置$_GET变量。
# url为相对url,如/mianfei/2/
# return php file name.
public static function real_url($url)
{
#convert to array
$url_arr = explode("/",$url);
# remove the elements which are false/null. After finish, array key not change.
# result maybe: array(2) { [1]=> string(7) "mianfei" [5]=> string(1) "2" }
$url_arr = array_filter($url_arr);
$router_name = "r"; #$r_mianfei_d
# get the router variable
$index = 0;
foreach($url_arr as $key=>$value)
{
if($index > 0)$tmp = !intval($value)? "s":"d";
else $tmp = !intval($value)? $value:"d";
$router_name .= "_{$tmp}"; #$r_mianfei_d
$index++;
}
# get the variable's value
if(isset(self::${$router_name}))
$router_val = self::${$router_name}; # get the router configuration
if(is_null($router_val)) return false; # no such router
$php_file = $router_val[0];
// $_GET
$index = 0;
foreach($url_arr as $key=>$value)
{
if($index==0) $_GET['action'] = $value;
else $_GET[$router_val[$index]] = $value;
$index++;
}
return $php_file;
}
}
// IIS和Apache下SERVER的区别
//-----------------IIS---------------------
//访问地址:http://qqxiula.w10.haohaohost.cn/mianfei/
//
//HTTP_HOST:qqxiula.w10.haohaohost.cn
//HTTPS=>off
//SCRIPT_NAME=>/404.php
//PATH_TRANSLATED=>d:/freehost/qqxiula/web
//QUERY_STRING=>404;http://qqxiula.w10.haohaohost.cn:80/mianfei/
//REMOTE_ADDR=>59.38.46.120
//REMOTE_HOST=>59.38.46.120
//SERVER_NAME=>qqxiula.w10.haohaohost.cn
//SERVER_PORT=>80
//SERVER_PROTOCOL=>HTTP/1.1
//SERVER_SOFTWARE=>Microsoft-IIS/6.0
//APPL_MD_PATH=>/LM/W3SVC/910/Root
//APPL_PHYSICAL_PATH=>d:/freehost/qqxiula/web/
//REQUEST_URI=>/404.php?404;http://qqxiula.w10.haohaohost.cn:80/mianfei/
//URL=>/404.php?404;http://qqxiula.w10.haohaohost.cn:80/mianfei/
//SCRIPT_FILENAME=>d:/freehost/qqxiula/web/404.php
//ORIG_PATH_INFO=>/404.php
//ORIG_PATH_TRANSLATED=>d:/freehost/qqxiula/web/404.php
//DOCUMENT_ROOT=>d:/freehost/qqxiula/web
//PHP_SELF=>/404.php
//HTTP_HOST=>qqxiula.w10.haohaohost.cn
//---------------------Apache-----------------------
//访问地址:http://localhost/qqxiula/mianfei/
//
//REDIRECT_STATUS=>404
//HTTP_HOST=>localhost
//SystemRoot=>C:/WINDOWS
//COMSPEC=>C:/WINDOWS/system32/cmd.exe
//Apache/2.2.4 (Win32) PHP/5.2.3 Server at localhost Port 80
//
//SERVER_SOFTWARE=>Apache/2.2.4 (Win32) PHP/5.2.3
//SERVER_NAME=>localhost
//SERVER_ADDR=>127.0.0.1
//SERVER_PORT=>80
//REMOTE_ADDR=>127.0.0.1
//DOCUMENT_ROOT=>D:/Development/AppServ/www
//SERVER_ADMIN=>tsball@qq.com
//SCRIPT_FILENAME=>D:/Development/AppServ/www/qqxiula/404.php
//REDIRECT_URL=>/qqxiula/mianfei/
//SERVER_PROTOCOL=>HTTP/1.1
//REQUEST_URI=>/qqxiula/mianfei/
//SCRIPT_NAME=>/qqxiula/404.php
//PHP_SELF=>/qqxiula/404.php
?>
要注意,如果404页面内容小于500字节,该页面则不起作用。
Apache和IIS下的$_SERVER有所不同,所以要注意。
对于错误跳转的页面,建议在页头加上以下注释,表明该页面是错误页面,主要是用来告诉访客,同时让搜索引擎感到更友好(一般该页面的内容比较固定,如果不同URL的内容很多一样,会降低你网站在搜索引擎的信誉/权重,它会认为你是垃圾站,内容都是一致的)。
对于正常跳转的页面,声明一下它本身是正确页面可能更好,因为该页面是在404页面中渲染/实现的,所以多少会被搜索引擎误解为错误页面,不被收录。 网上提供了一些测试页面状态代码的网站,不声明为200其实也是正确的,但是后来发现在搜狗浏览器却能识别出它是错误页面,所以最后捻量还是加上好吧。