解决magento1.4.0.1使用gspay接口用ie8浏览器报错不能跳转的问题

目前公司站群magentog使用spay支付接口有两大大问题还未解决:

1. 初次注册用户下单不能采集用户信息到支付页面

2. 用ie8或ie系列浏览器使用gspay支付接口下单的时候,在跳转页面会报错:Notice: Undefined index:  HTTP_REFERER  in /app/code/local/Mage/Gspay/Block/Standard/Redirect.php on line 97

第一个问题尚在研究,第二个问题在下午闲下来的时候给解决了

起因:magento1.4.0.1 在下单页面选择gspay付款方式的时候,在跳转页面/Gspay/standard/redirect/
如果使用的是ie系列浏览器,会出现notice级别的错误:Notice: Undefined index:  HTTP_REFERER  in /app/code/local/Mage/Gspay/Block/Standard/Redirect.php on line 97

跟踪代码发现在app/code/local/Mage/Gspay/Block/Standard/Redirect.php 第97行gspay获取url并解析是采用:$host=parse_url($_SERVER['HTTP_REFERER']);这样的方式,这样在火狐完全可以正常,但用ie8的时候就取不到HTTP_REFERER
的值了(貌似是bug),最后动手完善代码,经测试正常可用!

把第97行的$host=parse_url($_SERVER['HTTP_REFERER']);替换成如下代码:

$http    = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') ? 'https' : 'http';
if( empty($_SERVER['HTTP_REFERER']) ){
    $host    = array(
            'scheme'    => $http,
            'host'        => $_SERVER['HTTP_HOST']
        );
}else{
    $host    = parse_url($_SERVER['HTTP_REFERER']);
}

留此帮助其他遇到相同情况的朋友,嘿嘿·~

PHP断点续传的实现


$fname = './MMLDZG.mp3';  
$fp = fopen($fname,'rb');  
$fsize = filesize($fname);  
if (isset($_SERVER['HTTP_RANGE']) && ($_SERVER['HTTP_RANGE'] != "") && preg_match("/^bytes=([0-9]+)-$/i", $_SERVER['HTTP_RANGE'], $match) && ($match[1] < $fsize)) {
    $start = $match[1];
} else {
    $start = 0;
}
@header("Cache-control: public"); @header("Pragma: public");
if ($star--> 0) {  
    fseek($fp, $start);  
    Header("HTTP/1.1 206 Partial Content");  
    Header("Content-Length: " . ($fsize - $start));  
    Header("Content-Ranges: bytes" . $start . "-" . ($fsize - 1) . "/" . $fsize);  
} else {  
    header("Content-Length: $fsize");  
    Header("Accept-Ranges: bytes");  
}  
@header("Content-Type: application/octet-stream");  
@header("Content-Disposition: attachment;filename=mmdld.mp3");  
fpassthru($fp);  
 

fpassthru() 函数输出文件指针处的所有剩余数据。

该函数将给定的文件指针从当前的位置读取到 EOF,并把结果写到输出缓冲区。

抓取蜘蛛爬虫痕迹

//获取蜘蛛爬虫名或防采集
function isSpider(){
    $bots = array(
                    'Google'    => 'googlebot',
                    'Baidu'        => 'baiduspider',
                    'Yahoo'        => 'yahoo slurp',
                    'Soso'        => 'sosospider',
                    'Msn'        => 'msnbot',
                    'Altavista'    => 'scooter ',
                    'Sogou'        => 'sogou spider',
                    'Yodao'        => 'yodaobot'
            );
    $userAgent = strtolower($_SERVER['HTTP_USER_AGENT']);
    foreach ($bots as $k => $v){
        if (strstr($v,$userAgent)){
            return $k;
            break;
        }
    }
    return false;
}

 

获取哪种蜘蛛爬虫后保存蜘蛛痕迹。根据采集的时候HTTP_USER_AGENT为空可以来防止采集
//抓蜘蛛爬虫
$spi    = isSpider();
if($spi){
    $tlc_thispage    = addslashes($_SERVER['HTTP_USER_AGENT']);
    $file            = 'robot.txt';
    $time            = date('Y-m-d H:i:s',mktime());
    $handle            = fopen($file,'a+');
    $PR                = $_SERVER['REQUEST_URI'];
    fwrite($handle, "Time:{$time} ROBOT:{$spi} AGENT:{$tlc_thispage} URL:{$PR} \n\r");
    fclose($handle);
}

网站换域名链接失效的解决办法

 

本文来自小屋sjolzy.cn【原创】

 

网站域名改变之后,会导致一些链接失效,这时候我们可以用php301转向代码

把下面的代码加在网站核心文件里,就可以对全站的所有页面进行域名301转向,友好搜素引擎转向。

$url_old="sjolzy.cn"; //旧域名,不带"http://"和"/",可不带www
$url_new="sjolzy.com/"; //新域名,不带"http://",以"/"结尾
$bbs_dir="bbs"; //原域名的BBS目录名,根目录请为空
 
if ($bbs_dir)
{
	$bbs_count=strlen($bbs_dir)+2;
	$url_add=substr($_SERVER["REQUEST_URI"],$bbs_count);
} else {  
	$url_add=substr($_SERVER["REQUEST_URI"],1); 
}
 
if (stripos($_SERVER["SERVER_NAME"],$url_old))
{	
	$url301="http://".$url_new.$url_add; 
	header("HTTP/1.1 301 Moved Permanently"); 
	header("Location:$url301"); 
	exit();
}

以DISCUZ!(所有版本)为例,只需要把此代码放置于include/common.inc.php的”<?”后面即可。

PHP:$_SERVER中,QUERY_STRING、REQUEST_URI、SCRIPT_NAME与PHP_SELF四个变量的区别

,$_SERVER["QUERY_STRING"]
说明:查询(query)的字符串

2,$_SERVER["REQUEST_URI"]
说明:访问此页面所需的URI

3,$_SERVER["SCRIPT_NAME"]
说明:包含当前脚本的路径

4,$_SERVER["PHP_SELF"]
说明:当前正在执行脚本的文件名

实例:
1,http://www.sjolzy.com/ (直接打开主页)
结果:
$_SERVER["QUERY_STRING"] = ""
$_SERVER["REQUEST_URI"] = "/"
$_SERVER["SCRIPT_NAME"] = "/index.php"
$_SERVER["PHP_SELF"]     = "/index.php"

2,http://www. sjolzy.com/?p=222 (附带查询)
结果:
$_SERVER["QUERY_STRING"] = "p=222"
$_SERVER["REQUEST_URI"] = "/?p=222"
$_SERVER["SCRIPT_NAME"] = "/index.php"
$_SERVER["PHP_SELF"]     = "/index.php"

3,http://www. sjolzy.com/index.php?p=222&q=sjolzy
结果:
$_SERVER["QUERY_STRING"] = "p=222&q=sjolzy"
$_SERVER["REQUEST_URI"] = "/index.php?p=222&q= sjolzy"
$_SERVER["SCRIPT_NAME"] = "/index.php"
$_SERVER["PHP_SELF"]     = "/index.php"

$_SERVER["QUERY_STRING"]获取查询语句,实例中可知,获取的是?后面的值
$_SERVER["REQUEST_URI"] 获取http://www.biuuu.com后面的值,包括/
$_SERVER["SCRIPT_NAME"] 获取当前脚本的路径,如:index.php
$_SERVER["PHP_SELF"] 当前正在执行脚本的文件名

 

当前url:"http://".$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']

 

总结一下,对于QUERY_STRING,REQUEST_URI,SCRIPT_NAME和PHP_SELF,深入了解将有利于我们在$_SERVER函数中正确调用这四个值。通过实例详解$_SERVER函数中QUERY_STRING,REQUEST_URI,SCRIPT_NAME和PHP_SELF掌握四个变量之间的区别。

PHP服务器变量$_SERVER详解

 服务器变量 $_SERVER 详解:

1、$_SESSION['PHP_SELF'] -- 获取当前正在执行脚本的文件名

2、$_SERVER['SERVER_PROTOCOL'] -- 请求页面时通信协议的名称和版本。例如,“HTTP/1.0”。

3、$_SERVER['REQUEST_TIME'] -- 请求开始时的时间戳。从 PHP 5.1.0 起有效。和time函数效果一样。

4、$_SERVER['argv'] -- 传递给该脚本的参数。我试了下,get方法可以得到$_SERVER['argv'][0];post方法无法给他赋值。

5、$_SERVER['SERVER_NAME'] -- 返回当前主机名。

6、$_SERVER['SERVER_SOFTWARE'] -- 服务器标识的字串,在响应请求时的头信息中给出。 如Microsoft-IIS/6.0

7、$_SERVER['REQUEST_METHOD'] -- 访问页面时的请求方法。例如:“GET”、“HEAD”,“POST”,“PUT”。

8、$_SERVER['QUERY_STRING'] -- 查询(query)的字符串(URL 中第一个问号 ? 之后的内容)。

9、$_SERVER['DOCUMENT_ROOT'] -- 当前运行脚本所在的文档根目录。在服务器配置文件中定义。 如E:\server

10、$_SERVER['HTTP_ACCEPT'] -- 当前请求的 Accept: 头信息的内容。

11、$_SERVER['HTTP_ACCEPT_CHARSET'] -- 当前请求的 Accept-Charset: 头信息的内容。例如:“iso-8859-1,*,utf-8”。

12、$_SERVER['HTTP_ACCEPT_ENCODING'] -- 当前请求的 Accept-Encoding: 头信息的内容。例如:“gzip”。

13、$_SERVER['HTTP_ACCEPT_LANGUAGE'] -- 当前请求的 Accept-Language: 头信息的内容。例如:“en”。

14、$_SERVER['HTTP_CONNECTION'] -- 当前请求的 Connection: 头信息的内容。例如:“Keep-Alive”。

15、$_SERVER['HTTP_HOST'] -- 当前请求的 Host: 头信息的内容。

16、$_SERVER['HTTP_REFERER'] -- 链接到当前页面的前一页面的 URL 地址。

17、$_SERVER['HTTP_USER_AGENT'] -- 返回用户使用的浏览器信息。也可以使用 get_browser() 得到此信息。

18、$_SERVER['HTTPS'] -- 如果通过https访问,则被设为一个非空的值,否则返回off.

19、$_SERVER['REMOTE_ADDR'] -- 正在浏览当前页面用户的 IP 地址。

20、$_SERVER['REMOTE_HOST'] -- 正在浏览当前页面用户的主机名。反向域名解析基于该用户的 REMOTE_ADDR。如本地测试返回127.0.0.1

21、$_SERVER['REMOTE_PORT'] -- 用户连接到服务器时所使用的端口。我在本机测试没通过,不知道什么原因。

22、$_SERVER['SCRIPT_FILENAME'] -- 当前执行脚本的绝对路径名。如返回E:\server\index.php

23、$_SERVER['SERVER_ADMIN'] -- 该值指明了 Apache 服务器配置文件中的 SERVER_ADMIN 参数。如果脚本运行在一个虚拟主机上,则该值是那个虚拟主机的值

24、$_SERVER['SERVER_PORT'] -- 服务器所使用的端口。默认为“80”。如果使用 SSL 安全连接,则这个值为用户设置的 HTTP 端口。

25、$_SERVER['SERVER_SIGNATURE'] -- 包含服务器版本和虚拟主机名的字符串。

26、$_SERVER['PATH_TRANSLATED'] -- 当前脚本所在文件系统(不是文档根目录)的基本路径。这是在服务器进行虚拟到真实路径的映像后的结果。 Apache 2 用 户可以使用 httpd.conf 中的 AcceptPathInfo On 来定义 PATH_INFO。

27、$_SERVER['SCRIPT_NAME'] -- 包含当前脚本的路径。这在页面需要指向自己时非常有用。__FILE__ 包含当前文件的绝对路径和文件名(例如包含文件)。

28、$_SERVER['REQUEST_URI'] -- 访问此页面所需的 URI。例如,“/index.html”。

29、$_SERVER['PHP_AUTH_DIGEST'] -- 当作为 Apache 模块运行时,进行 HTTP Digest 认证的过程中,此变量被设置成客户端发送的“Authorization”HTTP 头内容(以便作进一步的认证操作)。

30、$_SERVER['PHP_AUTH_USER']-- 当 PHP 运行在 Apache 或 IIS(PHP 5 是 ISAPI)模块方式下,并且正在使用 HTTP 认证功能,这个变量便是用户输入的用户名。

31、$_SERVER['PHP_AUTH_PW'] -- 当 PHP 运行在 Apache 或 IIS(PHP 5 是 ISAPI)模块方式下,并且正在使用 HTTP 认证功能,这个变量便是用户输入的密码。

32、$_SERVER['AUTH_TYPE']--当 PHP 运行在 Apache 模块方式下,并且正在使用 HTTP 认证功能,这个变量便是认证的类型。