iPad 使用的是 Safari Mobile 浏览器,User Agent 是:
Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B334b Safari/531.21.10
判断是否 iPad 浏览器,关键是看它的 User Agent 中是否有 iPad。
1、js实现代码
function is_iPad(){
var ua = navigator.userAgent.toLowerCase();
if(ua.match(/iPad/i)=="ipad") {
return true;
} else {
return false;
}
}
</script>
2、php实现
<?php
//方法1
$is_iPad = (bool) strpos($_SERVER['HTTP_USER_AGENT'],'iPad');
//方法2
$agent = strtolower()($_SERVER['HTTP_USER_AGENT']);
$is_pc = (strpos($agent, 'windows nt')) ? true : false;
$is_iphone = (strpos($agent, 'iphone')) ? true : false;
$is_ipad = (strpos($agent, 'ipad')) ? true : false;
if($is_pc){
echo "PC机"; //by http://www.
}
if($is_iphone){
echo "iPhone";
}
if($is_ipad){
echo "iPad";
}
?>
3、htaccess
RewriteRule ^(.*)$ http://ipad. [R=301]
如果是 iPad 浏览器,跳转到 iPad 页面。
在php.ini中有个配置项是register_globals,这个配置影响到php如何接收传递过来的参数。
当遇到表单无法传递数据?程序无法得到传递过来的变量?诸如此类的问题时,你有必要仔细阅读本文的介绍了。
register_globals的值可以设置为:On或者Off。
通过以下的例子,来看看它们之间的区别。
<input type=”text” name=”user_name” id=”user_name”>
<input type=”password” name=”user_pass” id=”user_pass”>
<input type=”submit” value=”login”>
</form>
当register_globals=Off时,下一个程序接收时应该用$_GET['user_name']和$_GET['user_pass']来接受传递过来的值。
(注:当<form>的method属性为post的时候应该用$_POST['user_name']和$_POST['user_pass'])
当register_globals=On时,下一个程序可以直接使用$user_name和$user_pass来接受值。
也就是说,register_globals注册为全局变量,所以当On时,传递过来的值会被直接的注册为全局变量直接使用,而Off的时候,我们需要到特定的数组里去得到它。
所以,碰到上边那些无法得到值的问题的朋友,应该首先检查一下register_globals的设置和你获取值的方法是否匹配。
注:查看可以用phpinfo()函数或直接查看php.ini。
使用Off的原因如下:
1、php以后的新版本默认都用Off,虽然你可以设置它为On,但是当你无法控制服务器的时候,你的代码的兼容性就成为一个大问题,所以,你最好从现在就开始用Off的风格开始编程
2、参考文章:
http://www./shouce/php5/security.globals.html
问题:以前用On风格写的大量脚本怎么办?
这样看你的前期脚本规划如何了。如果有个公共包含文件,比如config.inc.php一类的文件,在这个文件里加上以下的代码来模拟一下。
if ( !ini_get(‘register_globals’) )
{
extract($_POST);
extract($_GET);
extract($_SERVER);
extract($_FILES);
extract($_ENV);
extract($_COOKIE);
if ( isset()($_SESSION) )
{
extract($_SESSION);
}
}
?>
register_globals = Off的情况不仅仅影响到如何获取从<form>、url传递过来的数据,也影响到session、cookie,对应的,得到session、cookie的方式应该为:$_SESSION[]、$_COOKIE。同时对于session的处理也有一些改变,比如,session_register()没有必要而且失效,具体的变化,请查看php 手册中的Session handling functions。
$_REQUEST中间的内容实际上还是来源于$_GET $_POST $_COOKIE,缺点是无法判断变量到底来自于get post 还是cookie,对要求比较严格的场合不适用。
就这么一点关于register_globals的知识,都是如此博大精深,优秀的php果然不同凡响啊。
出于安全考虑,常常会关闭fopen, file_get_contents, 也就是会把 allow_url_fopen设置为OFF。
此时大家可以借助下面的类,继续使用这些函数。供大家学习参考。
代码如下:
/**
* BrowserEmulator class. Provides methods for opening urls and emulating
* a web browser request.
**/
class BrowserEmulator {
var $headerLines = Array();
var $postData = Array();
var $multiPartPost = False;
var $authUser = "";
var $authPass = "";
var $port;
var $lastResponse = '';
var $lastRequest = '';
var $debug = false;
var $customHttp = False;
public function BrowserEmulator() {
$this->resetHeaderLines();
$this->resetPort();
}
/**
* Adds a single header field to the HTTP request header. The resulting header
* line will have the format
* $name: $value\n
**/
public function addHeaderLine($name, $value) {
$this->headerLines[$name] = $value;
}
/**
* Deletes all custom header lines. This will not remove the User-Agent header field,
* which is necessary for correct operation.
**/
public function resetHeaderLines() {
$this->headerLines = Array();
/*******************************************************************************/
/************** YOU MAX SET THE USER AGENT STRING HERE *******************/
/* http://www. */
/* default is "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)", */
/* which means Internet Explorer 6.0 on WinXP */
$this->headerLines["User-Agent"] = 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.10) Gecko/2009042315 Firefox/3.0.10';
/*******************************************************************************/
/**
* Set default to accept gzip encoded files
*/
$this->headerLines["Accept-Encoding"] = "*/*";
}
/**
* Add a post parameter. Post parameters are sent in the body of an HTTP POST request.
**/
public function addPostData($name, $value = '') {
$this->postData[$name] = $value;
}
/**
* Deletes all custom post parameters.
**/
public function resetPostData() {
$this->postData = Array();
}
public function handleMultiPart() {
$boundry = '----------------------------795088511166260704540879626';
$this->headerLines["Accept"] = ' text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8';
$this->headerLines["Connection"] = 'Close';
$this->headerLines["Content-Type"] = "multipart/form-data; boundary=$boundry";
$out = '';
foreach($this->postData as $item => $data) {
if(is_array($data)) {
$out .= "--$boundry\r\n"
."Content-Disposition: form-data; name=\"$item\"; filename=\"{$data['filename']}\"\r\n"
."Content-Type: application/octet-stream\r\n"
."\r\n"
.$data['contents']."\r\n";
} else {
$out .= "--$boundry\r\n"
."Content-Disposition: form-data; name=\"$item\"\r\n"
."\r\n"
.$data."\r\n";
}
}
$out .= "--{$boundry}--\r\n";
return $out;
}
/**
* Sets an auth user and password to use for the request.
* Set both as emptyempty strings to disable authentication.
**/
public function setAuth($user, $pass) {
$this->authUser = $user;
$this->authPass = $pass;
}
/**
* Selects a custom port to use for the request.
**/
public function setPort($portNumber) {
$this->port = $portNumber;
}
/**
* Resets the port used for request to the HTTP default (80).
**/
public function resetPort() {
$this->port = 80;
}
/**
* Parse any cookies set in the URL, and return the trimed string
**/
public function preparseURL(/blog_article/$url/index.html) {
if($cookies = stristr($url, ':COOKIE:')) {
$url = rtrim(substr($url, 0, -strlen($cookies)), '&');
$this->addHeaderLine("Cookie", '$Version=1; '.strtr(substr($cookies, 8), '&', ';'));
}
return $url;
}
/**
* Make an fopen call to $url with the parameters set by previous member
* method calls. Send all set headers, post data and user authentication data.
* Returns a file handle on success, or false on failure.
**/
public function fopen($url) {
$url = $this->preparseURL(/blog_article/$url/index.html);
$this->lastResponse = Array();
$parts = parse_url($url);
$protocol = $parts['scheme'];
$server = $parts['host'];
$port = $parts['port'];
$path = $parts['path'];
if(isset()($parts['query'])) {
$path .= '?'.$parts['query'];
}
if($protocol == 'https') {
// TODO: https is locked to port 443, why?
$server = 'ssl://'.$server;
$this->setPort(443);
} elseif ($port!="") {
$this->setPort($port);
}
if ($path=="") $path = "/";
$socket = false;
$socket = fsockopen($server, $this->port);
if ($socket) {
if ($this->authUser!="" && $this->authPass!="") {
$this->headerLines["Authorization"] = "Basic ".base64_encode($this->authUser.":".$this->authPass);
}
if($this->customHttp)
$request = $this->customHttp." $path\r\n";
elseif (count($this->postData)==0)
$request = "GET $path HTTP/1.0\r\n";
else
$request = "POST $path HTTP/1.1\r\n";
$request .= "Host: {$parts['host']}\r\n";
if ($this->debug) echo $request;
if (count($this->postData)>0) {
if($this->multiPartPost) {
$PostString = $this->handleMultiPart();
} else {
$PostStringArray = Array();
foreach ($this->postData AS $key=>$value) {
if(emptyempty($value))
$PostStringArray[] = $key;
else
$PostStringArray[] = "$key=$value";
}
$PostString = join("&", $PostStringArray);
}
$this->headerLines["Content-Length"] = strlen($PostString);
}
foreach ($this->headerLines AS $key=>$value) {
if ($this->debug) echo "$key: $value\n";
$request .= "$key: $value\r\n";
}
if ($this->debug) echo "\n";
$request .= "\r\n";
if (count($this->postData)>0) {
$request .= $PostString;
}
}
$this->lastRequest = $request;
for ($written = 0; $written < strlen($request); $written += $fwrite) {
$fwrite = fwrite($socket, substr($request, $written));
if (!$fwrite) {
break;
}
}
if ($this->debug) echo "\n";
if ($socket) {
$line = fgets($socket);
if ($this->debug) echo $line;
$this->lastResponse .= $line;
$status = substr($line,9,3);
while (trim($line = fgets($socket)) != ""){
if ($this->debug) echo "$line";
$this->lastResponse .= $line;
if ($status=="401" AND strpos($line,"WWW-Authenticate: Basic realm=\"")===0) {
fclose($socket);
return FALSE;
}
}
}
return $socket;
}
/**
* Make an file call to $url with the parameters set by previous member
* method calls. Send all set headers, post data and user authentication data.
* Returns the requested file as a string on success, or false on failure.
**/
public function file_get_contents($url) {
if(file_exists($url)) // local file
return file_get_contents($url);
$file = '';
$socket = $this->fopen($url);
if ($socket) {
while (!feof($socket)) {
$file .= fgets($socket);
}
} else {
Yii::log('Browser Emulator: file_get_contents bad socket', CLogger::LEVEL_ERROR);
return FALSE;
}
fclose($socket);
if(strstr($this->lastResponse, 'Content-Encoding: gzip') !== FALSE) {
if(function_exists('gzinflate')) {
$file = gzinflate(substr($file,10));
if($this->debug) echo "Result file: ".$file;
}
}
return $file;
}
/**
* Simulate a file() call by exploding file_get_contents()
**/
public function file($url) {
$data = $this->file_get_contents($url);
if($data)
return explode()('\n', $data);
return False;
}
public function getLastResponseHeaders() {
return $this->lastResponse;
}
}
?>
实例:
<?php
$be = new BrowserEmulator();
$output = $be->file_get_contents("http:///rss.php");
$response = $be->getLastResponseHeaders();
echo $output;
?>
关联:
PHP获取远程文件内容
function curl_get_contents($url)
{
$dir = pathinfo($url);
$host = $dir['dirname'];
$refer = $host.'/';
$ch = curl_init($url);
curl_setopt ($ch, CURLOPT_REFERER, $refer);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}
?>