2010-07-30 87 views
11

目前,Web应用程序需要提供某种形式的跨域HTTP标头的访问其他域中的数据:http://openfontlibrary.org/wiki/Web_Font_linking_and_Cross-Origin_Resource_SharingCouchDB从XMLHttpRequest跨域访问?

有什么办法来配置CouchDB的支持无限跨域访问? (它可能在内部使用apache httpd)我只使用db内部目的。

+0

不幸的是,该链接现在已经死亡,并且返回一个404错误页面。 – MKroehnert 2013-09-04 12:03:19

+0

@MKroehnert哦。而且让我发疯的是,我甚至不记得三年前我想做什么。 – Eonil 2013-09-04 17:31:31

回答

8

您可以使用CouchDB显示功能来设置Access-Control-Allow-Origin标题。


function(doc, req) { 
    return { 
    body : 'whatever', 
    headers : { 
     "Access-Control-Allow-Origin": "\"*\"" 
    } 
    } 
} 

上显示的功能更多资讯:http://guide.couchdb.org/draft/show.html

+0

这不幸的是不支持POST,PUT和DELETE :(有没有办法支持这些方法? – 2011-09-07 23:22:40

14

我发现解决这个问题的最简单方法是使用本地安装的Apache Web服务器启用mod_proxy的模块和配置的ProxyPass指令。

让与

的index.html有以下内容

<html> 
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js" type="text/javascript"></script> 
<script type="text/javascript"> 

var http = XMLHttpRequest(); 
http.open('GET', 'http://127.0.0.1:5984/_all_dbs', true); // ! WE WILL CHANGE THIS LINE 
http.onreadystatechange = function() { 
    if (http.readyState == 4 && http.status == 200) { 
     console.debug('it works'); 
    } 
}; 
http.send(null) 
</script> 
<head><title>Test Access to CouchDB</title></head> 
<body> 
</body> 
</html> 

(在这种情况下端口不匹配8181!= 5984) 。

如何修复

  • 配置Apache(APACHE_HOME/conf目录/ httpd.conf文件)
    • 取消注释LoadModule proxy_module modules/mod_proxy.so
    • 取消注释LoadModule proxy_http_module modules/mod_proxy_http.so
    • 添加ProxyPass /couchdb http://127.0.0.1:5984(如顶级特性y像ServerAdmin)
    • 重新启动Apache
  • 修改索引。HTML
    • 取代http.open('GET', 'http://127.0.0.1:5984/_all_dbs', true);http.open('GET', '/couchdb/_all_dbs', true);

现在就来试试,你会看到 '它的工作原理' 输出在JavaScript控制台(我用Firebug的控制台)

3

Eonil,我想跨域访问也是如此,但CouchDB不支持, 您可以投票支持该功能在此实施: https://issues.apache.org/jira/browse/COUCHDB-431

ps:该功能请求已在23/Jul/09创建:(我希望他们听到我们。

+0

感谢你让我知道,我已经投票了!我认为HTTP REST协议功能就是这样一个语法糖的东西。应该同时提供方便的功能,但我不希望CouchDB的人这样做,因为我猜他们正在做某种业务已经不需要关心普通用户了,而且我建议你检查* OrientDB *为了提供快速,方便的HTTP REST接口,但我决定回到PostgreSQL – Eonil 2011-02-25 03:09:59

+0

谢谢!我不知道OrientDB,它的功能列表看起来很有趣,在我的情况下,我发现HTTP REST有用(或需要)因为我打算使用jQuery从客户端浏览器访问数据库存储。我对CouchDB最为沮丧的是,使用MapReduce的静态视图是唯一的查询机制! – Benja 2011-02-28 04:45:30

1

我已经解决了,这是写一个2线雷博尔包装CGI,然后问我阿贾克斯jQuery来叫我的CGI替代的网址从CouchDB中获取数据的方式:

Rebol [ 

    {wrapper to overcome cross-domain fetching of data from couchdb} 
] 
print "Content-type: application/json^/" ;text/plain^/" 
print read http://127.0.0.1:5984/syncspace/_design/vals/_view/xxxx?group=true 
1

我做了一个列表返回JSONP ...但还是只读支持

"jsonp": "function(head, req) { 
    var row; 
    var rows=[]; 
    while(row = getRow()){ 
     rows.push(row); 
    } 
    rj = JSON.stringify({\"rows\" : rows,\"total_rows\":rows.length}); 
    return req.query.callback+\"(\"+rj+\");\"; 
}", 
4

的CouchDB 1.3解决了这个与CORS:https://wiki.apache.org/couchdb/CORS

+0

所有通过包管理器在debian/ubuntu上安装couchdb。截至今天(2014年10月10日),您将获得的版本是1.2,并且不支持CORS选项。如果你想使用它们,你必须从源代码安装从不版本。我花了一些时间才意识到为什么我的CORS设置不起作用,原因是我通过apt-get install couchdb安装了它,它的版本是1.2。 – szydan 2014-10-10 09:38:55

3

您应该启用CORS in CouchDB> 1.3。这很简单,只需编辑default.ini并设置enable_cors = true,然后在[cors]部分下修改origins即可获得所需的顶级URL。例如,我必须执行以下操作将我的本地grunt服务器列入白名单。

enable_cors = true 
[cors] 
origins = http://127.0.0.1:9000 

完全回答这个问题,但你要设置

origins = * 

虽然这可以说是一个漏洞,你可能应该限制起源更多。

+0

注意所有通过包管理器在debian/ubuntu上安装couchdb。截至今天(2014年10月10日),您将获得的版本是1.2,并且不支持CORS选项。如果你想使用它们,你必须从源代码安装从不版本。我花了一些时间才意识到为什么我的CORS设置不起作用,原因是我通过apt-get install couchdb安装了它,它的版本是1.2。 – szydan 2014-10-10 09:39:33