目前,Web应用程序需要提供某种跨域HTTP标头来访问其他域上的数据:http://openfontlibrary.org/wiki/Web_Font_linking_and_Cross-Origin_Resource_Sharing
有没有办法配置CouchDB来支持无限制的跨域访问? (它可能在内部使用apache httpd)我只在内部使用db。
答案 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)。
如何修复
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等顶级属性)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+\");\";
}",