XMLHttpRequest的CouchDB跨域访问?

时间:2010-07-30 13:17:20

标签: cross-domain couchdb

目前,Web应用程序需要提供某种跨域HTTP标头来访问其他域上的数据:http://openfontlibrary.org/wiki/Web_Font_linking_and_Cross-Origin_Resource_Sharing

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

7 个答案:

答案 0 :(得分:14)

我发现解决问题的最简单方法是使用已启用 mod_proxy 模块的本地安装的 Apache Web服务器并配置 ProxyPass 指令。< / p>

让我们从基本设置开始

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 (作为ServerAdmin等顶级属性)
    • 重启Apache
  • 修改index.html
    • 使用 http.open('GET', 'http://127.0.0.1:5984/_all_dbs', true);
    • 替换http.open('GET', '/couchdb/_all_dbs', true);

立即尝试,你应该在javascript控制台中看到'it works'输出(我使用的是Firebug控制台)

答案 1 :(得分:8)

您可以使用CouchDB show函数来设置Access-Control-Allow-Origin标头。


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

有关show functions的更多信息:http://guide.couchdb.org/draft/show.html

答案 2 :(得分:4)

CouchDB 1.3使用CORS解决了这个问题:https://wiki.apache.org/couchdb/CORS

答案 3 :(得分:3)

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

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

答案 4 :(得分:3)

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

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

尽管你想要设置

,但要完全回答这个问题
origins = *

虽然这可能被认为是一个漏洞,你应该更多地限制其起源。

答案 5 :(得分:1)

我解决这个问题的方法是编写一个2行的Rebol包装器CGI,然后让我的Jquery中的Ajax调用我的CGI而不是从Couchdb获取数据的URL:

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

答案 6 :(得分:1)

我创建了一个返回JSON的列表......但仍然只读支持

"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+\");\";
}",