如何让 Firefox,Chrome,Safari 浏览器模拟 iPad User Agent

在给 iPad 做的网页进行测试的时候,有时候需要在 PC 上模拟 iPad User Agent 去访问网页,今天就介绍下如何让 Firefox,Chrome,Safari 浏览器模拟 iPad User Agent。

iPad User Agent

首先 iPad 的 User Agent:

Mozilla/5.0(iPad; U; CPU iPhone OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B314 Safari/531.21.10

Safari 浏览器

首先到 偏好设置 > 高级选项,确保“在菜单栏中显示开发菜单”选中。
然后到 开发 > 用户代理,选择 Mobile Safari 3.2.2 — iPad

Chrome 浏览器

打开 cmd,然后进入 Chrome 安装目录(C:\Users\xxxx\AppData\Local\Google\Chrome SxS\Application\chrome.exe)。
然后在 cmd 输入命令: chrome.exe -user-agent="Mozilla/5.0(iPad; U; CPU iPhone OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B314 Safari/531.21.10"

Firefox 浏览器

下载一个 User Agent Switch 的插件
安装之后,点击 工具 > Default User Agent > Edit User Agent,添加一个 iPad 的 User Agent。

User Agent 上面有了。
App Code Name 输入:iPad。
App Name 输入:Mobile Safari
App Version 输入:5.0 (Macintosh; en-US)

IE 浏览器

哈哈,没有可能,即使有可能,你也不会傻到用 IE 浏览器来测试了。

最常用的html字符实体

web在对输入参数输出时必须对输出作html转义

最常用的html字符实体如下:

显示结果 描述 实体名称 实体编号
空格    
< 小于号 &lt; &#60;
> 大于号 &gt; &#62;
& 和号 &amp; &#38;
引号 &quot; &#34;
撇号 &apos; (IE不支持) &#39;

用shc加密shell脚本

软件介绍:

shc可以用来对shell脚本进行加密,可以将shell脚本转换为一个可执行的二进制文件。经过shc对shell脚本进行加密后,会同时生成两种个新的文件,一个是加密后的可执行的二进制文件(文件名以.x结束),另一个是C语言的原文件(文件名以.x.c结束)。

下面就说明一下shc的安装,参数,以及使用示例: 下载安装: (官网下载地址: http://www.datsi.fi.upm.es/~frosal/sources/) # wget http://www.datsi.fi.upm.es/~frosal/sources/-3.8.7.tgz # cd shc-3.8.7 # make # make install (仅用make就可以完成安装,运行shc时要指出绝对路径;用make install,将shc安装到/usr/local/bin下,可以直接运行)

常用参数:

-e date Expiration date in dd/mm/yyyy format [none](指定过期日期)

-m message message to display upon expiration ["Please contact your provider"](指定过期提示的信息)

-f script_name File name of the script to compile(指定要编译的shell的路径及文件名)

-r Relax security. Make a redistributable binary which executes on different systems running the same operat-ing system.(可以相同操作系统的不同系统中执行)

-v Verbose compilation(编译的详细情况)

使用示例: [root@centos54 tmp]# /usr/local/src/shc-3.8.7/shc -e 20/10/2010 -m “contact xxx@163.com” -v -r -f ./ex.sh -e:指定过期时间为2010年10月20日 -m:过期后打印出的信息; -v: verbose -r: 可在相同操作系统的不同主机上执行 -f: 指定源shell

使用:

# shc -r -f script-name

注意:要有-r选项, -f 后跟要加密的脚本名. 运行后会生成两个文件,script-name.x 和 script-name.x.c script-name.x是加密后的可执行的二进制文件. ./script-name 即可运行. script-name.x.c是生成script-name.x的原文件(c语言)

但由于生成的文件需要动态谅解不能用作其他机器,需要下面的方法来生成静态的链接库文件。

生成静态链接的二进制可执行文件

可以通过下面的方法生成一个静态链接的二进制可执行文件:

# CFLAGS=-static shc -r -f test.sh

# file test.sh.x

python 操作文件—-文件读写

python进行文件读写的函数是open或file

file_handler = open(filename,,mode)

Table mode

模式

描述

r 以读方式打开文件,可读取文件信息。
w 以写方式打开文件,可向文件写入信息。如文件存在,则清空该文件,再写入新内容
a 以追加模式打开文件(即一打开文件,文件指针自动移到文件末尾),如果文件不存在则创建
r+ 以读写方式打开文件,可对文件进行读和写操作。
w+ 消除文件内容,然后以读写方式打开文件。
a+ 以读写方式打开文件,并把文件指针移到文件尾。
b 以二进制模式打开文件,而不是以文本模式。该模式只对Windows或Dos有效,类Unix的文件是用二进制模式进行操作的。

 

Table 文件对象方法

方法

描述

f.close() 关闭文件,记住用open()打开文件后一定要记得关闭它,否则会占用系统的可打开文件句柄数。
f.fileno() 获得文件描述符,是一个数字
f.flush() 刷新输出缓存
f.isatty() 如果文件是一个交互终端,则返回True,否则返回False。
f.read([count]) 读出文件,如果有count,则读出count个字节。
f.readline() 读出一行信息。
f.readlines() 读出所有行,也就是读出整个文件的信息。
f.seek(offset[,where]) 把文件指针移动到相对于where的offset位置。where为0表示文件开始处,这是默认值 ;1表示当前位置;2表示文件结尾。
f.tell() 获得文件指针位置。
f.truncate([size]) 截取文件,使文件的大小为size。
f.write(string) 把string字符串写入文件。
f.writelines(list) 把list中的字符串一行一行地写入文件,是连续写入文件,没有换行。

 

示例文件如下:

#-*- encoding:UTF-8 -*-
filehandler = open(‘c:\\111.txt’,'r’)    #以读方式打开文件,rb为二进制方式(如图片或可执行文件等)

print ‘read() function:’              #读取整个文件
print filehandler.read()

print ‘readline() function:’          #返回文件头,读取一行
filehandler.seek(0)
print filehandler.readline()

print ‘readlines() function:’         #返回文件头,返回所有行的列表
filehandler.seek(0)
print filehandler.readlines()

print ‘list all lines’                #返回文件头,显示所有行
filehandler.seek(0)
textlist = filehandler.readlines()
for line in textlist:
print line,
print
print

print ‘seek(15) function’               #移位到第15个字符,从16个字符开始显示余下内容
filehandler.seek(15)
print ‘tell() function’
print filehandler.tell()              #显示当前位置
print filehandler.read()

filehandler.close()                   #关闭文件句柄

Nginx realip_module 模块 = Apache mod_rpaf

Apache 有个第三方开发的 mod_rpaf ,用于当 Apache 置于 proxy 后端的时候接收到前端送来的 IP head
从而获取到真实的IP. 不然日志跟应用都始终只能获取到 反向代理服务端的IP

详细请看:http://www.oschina.net/discuss/thread/675
简单说就是,Nginx –> Apache 能获取到用户访问的真实IP .
但如果反过来,又或者是 Squid –> Nginx 呢?

有这么一情况,某网站静态文件很多,而且用户访问的来源有网通,有电信,有铁通…设置还有国外。
为了令处于不同网络运营商的用户收取静态文件的速度都有良好的体现,该网站分别在这些不同运营商的积分中部署了Squid,然后统一 Proxy 到主站的 Nginx 上,形成分布式缓存架构。

如果单是这样的话,主站上 Nginx 的日志,或者应用所获得的IP来源,始终都只会是各个机房中 Squid 的IP。而不是用户的真实IP。Apache 的话,能通过以上所提到的mod_rpaf解决。当然,强大的 Nginx 也有自己的看家法宝。

Nginx 有个在编译时默认不加载的模块 http_realip_module ,就是用来实现这一功能。
但网上很多作者对这一模块的理解完全错误,以为是 Proxy 参数里头的 proxy_set_header 。

proxy_set_header 用于向后端转发 IP head,这一参数是位于 proxy_module 模块中的,而并非 http_realip_module .
好多的博主写文章的时候,都把这模块的用途写成了“为后端应用提供 realip ”

Nginx 官方 wiki 对于该模块的说明 http://wiki.nginx.org/NginxHttpRealIpModule

“It is useful if nginx works behind some proxy of L7 load balanver, and request come from local IP, but proxy add request header with client’s IP.

This module isn’t built by default, enable it with the configure option ”

说简单了,就是 Nginx 的 http_realip_module = Apache 的 mod_rpaf 用于接受前端发来的 IP head 信息,从获取到真是的用户IP。

配置方式相当简单,重新编译 Nginx 加上 –with-http_realip_module 参数,如:

./configure –prefix=/opt/nginx –with-http_stub_status_module –with-pcre=../pcre-6.6 –with-http_realip_module
make
make install

怎么?Nginx 的服务正在跑着?要重启不容易?
简单,原来你的 Nginx 装在哪,重新编译的时候就选哪,直接 make install 进去就会把原来的覆盖掉。

然后执行 Killall -s USR2 nginx 即可平滑升级。
编辑 Nginx.conf

在 location 里头插入

set_real_ip_from 192.168.1.0/24; 指定接收来自哪个前端发送的 IP head 可以是单个IP或者IP段
set_real_ip_from 192.168.2.1;
real_ip_header X-Real-IP; IP head 的对应参数,默认即可。

配置跟 mod_rpaf 大致相同!

配置完成后 sbin/nginx -t 测试语法
测试无误执行 Killall -s HUP nginx 平滑加载配置。

这么就无间断完成了Nginx这一模块的加载。

————————————————————————————————————————————
自从Nginx出现以后,我们都喜欢让 Nginx 跑在前方处理静态文件,然后通过 proxy 把动态请求过滤给 apache。

这么有个问题,跑在后方 apache 上的应用获取到的IP都是Nginx所在服务器的IP ,或者是本机 127.0.0.1 。
最明显就是查看 apache 的访问日志。就会见到来来去去都是内网的IP。

如果你的应用有诸如,“单个IP不能重复登陆”,“单个IP注册相隔n分钟”… 之类用于IP判别的安全规则。
这么就麻烦了….

但还好,你可以通过修改 nginx proxy 的参数令后端应用获取到 Nginx 发来的请求报文获取到外网的IP。

proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

但这解决的问题单单只是应用上,apache 日志上所获取的ip依然还是本地。

特别有些考虑不周全的应用,例如 Tattertools (一个博客程序) 就会犯误。
后台的访问日志死活显示访客数 1,ip来自 127.0.0.1

搜寻了一下,发现了apache这一个来自第三方的mod 配合Nginx proxy 使用。
说明:http://stderr.net/apache/rpaf/
下载:http://stderr.net/apache/rpaf/download/
最新版本是 mod_rpaf-0.6.tar.gz
安装也相当简单。
# tar zxvf mod_rpaf-0.6.tar.gz 下载后解压
# cd mod_rpaf-0.6

Apache 的目录按自己的环境修改,并选择相应的安装方式:
#/usr/local/apache/bin/apxs -i -a -c mod_rpaf.c Apache 1.3.x 的安装方式
#/usr/local/apache/bin/apxs -i -c -n mod_rpaf-2.0.so mod_rpaf-2.0.c Apache 2.x 的安装方式

完成后会在 http.conf 的 LoadModule 区域 为你多加了一行。
LoadModule mod_rpaf-2.0.so_module modules/mod_rpaf-2.0.so
经 apache 2.2.6 的实验,使用这一行启动 apache 的时候会报错的。

所以改为:
LoadModule rpaf_module modules/mod_rpaf-2.0.so
并在下方添加

RPAFenable On
RPAFsethostname On
RPAFproxy_ips 127.0.0.1 192.168.10.2 # 填写Nginx所在的内网IP。
RPAFheader X-Forwarded-For

保存退出后重启apache
再看看 apache 的日志内容? 呵,不再是来来去去的那几个IP了吧。

Next page