通过jsonp实现js跨域时,需要通过url参数指定回调函数名,比如:
> curl localhost/jsonptest?callback=cb123 > cb123({'name': 'kobe'});下面就介绍如何在nginx中实现这一功能。
我们知道nginx中有着很多优秀的模块,这里也不例外,需要依赖几个第三方模块,包括:ngx_devel,set misc和echo。下载可以通过git,很方便:
git clone git://github.com/simpl/ngx_devel_kit.git git clone git://github.com/agentzh/set-misc-nginx-module.git git clone git://github.com/agentzh/echo-nginx-module.git要重新编译nginx:
./configure --prefix=/home/server/NGINX_PREFIX \ --add-module=/home/app/shmmap/ngx_module/ngx_devel_kit/ \ --add-module=/home/app/shmmap/ngx_module/set-misc-nginx-module/ \ --add-module=/home/app/shmmap/ngx_module/echo-nginx-module/成功编译完nginx后,下面看看实现jsonp的具体配置:
location /jsonptest { default_type 'application/x-javascript'; # 默认的回调函数名,如果不提供callback # 使用了set misc模块的set_if_empty指令。 # 如果arg_callback为空,则赋值为第二个参数 set_if_empty $arg_callback '_ntes_quote_callback'; # 防止xss攻击 # 符合js标识符规则,则输出 if ($arg_callback ~* (^[^0-9][0-9a-z._]+$)) { echo_before_body -n "$arg_callback("; echo -n "{name: 'kobe'}"; echo_after_body -n ");"; } # 不符合js标识符规则,返回403 if ($arg_callback !~* (^[^0-9][0-9a-z._]+$)) { return 403; } }下面测试一下:
> curl localhost:8088/jsonptest?callback=abc123 > abc123({name: 'kobe'});下面测试xss攻击:
> curl 'localhost:8088/jsonptest?callback=alert(123);abc123' <html> <head><title>404 Not Found</title></head> <body bgcolor="white"> <center><h1>404 Not Found</h1></center> <hr><center>nginx/1.0.5</center> </body> </html>通过上面的配置就实现了简单的jsonp调用,nginx社区提供了丰富的、优秀的模块,可以在此基础上构建丰富的应用,比如可以使用ngx_lua很简单的就实现上述功能。