不用跨域,ExtJS通过代理使用CouchDB

在选择CoudhDB做数据库,Apache做Web服务器时,在客户端用ExtJS可以直接通过HTTP来访问CouchDB的数据。但通常CouchDB和Apache是位于不同的端口,这也就意味两者位于不同的域,所以对于ExtJS而言,要想使用CouchDB,必须得使用ScriptTagProxy来进行跨域访问了。

但ScriptTagProxy在实际使用中发现,如果一个返回的JSON字符串较长,CouchDB会将JSON使用’\n’截断,在Chrome/Firefox下都会提示”无法解析json”(Firefox下错误消息为”invalid label”),但如果不跨域使用HttpProxy来解释包含有’\n’的JSON字符串,却能正常工作,看起来似乎是ScriptTagProxy和HttpProxy在解释JSON字符串的方式有上区别吧。

既然没打算去Hack ScriptTagProxy代码,那就只好Google一下了。翻了翻,发现有人使用Apache的mod_proxy_http可以免跨域,具体做法如下:

$ sudo a2enmod proxy_http
$ vim /etc/apache2/mods-enabled/proxy.conf
内的Proxy_Via设置为on

编辑虚拟主机配置在(VirtualHost *:80)下增加两行

ProxyPass /cdb/ http://localhost:6902/
ProxyPassReverse /cdb/ http://localhost:6902/
$ sudo /etc/init.d/apache2 restart

这样,便可以通过”http://localhost/cdb” 来访问原来”http://localhost:6902″的资源了,在ExtJS中,也可以将ScriptTagProxy换成HttpProxy来使用了。