目前,Web应用程序需要提供某种形式的跨域HTTP标头的访问其他域中的数据:http://openfontlibrary.org/wiki/Web_Font_linking_and_Cross-Origin_Resource_SharingCouchDB从XMLHttpRequest跨域访问?
有什么办法来配置CouchDB的支持无限跨域访问? (它可能在内部使用apache httpd)我只使用db内部目的。
目前,Web应用程序需要提供某种形式的跨域HTTP标头的访问其他域中的数据:http://openfontlibrary.org/wiki/Web_Font_linking_and_Cross-Origin_Resource_SharingCouchDB从XMLHttpRequest跨域访问?
有什么办法来配置CouchDB的支持无限跨域访问? (它可能在内部使用apache httpd)我只使用db内部目的。
您可以使用CouchDB显示功能来设置Access-Control-Allow-Origin标题。
function(doc, req) {
return {
body : 'whatever',
headers : {
"Access-Control-Allow-Origin": "\"*\""
}
}
}
上显示的功能更多资讯:http://guide.couchdb.org/draft/show.html
这不幸的是不支持POST,PUT和DELETE :(有没有办法支持这些方法? – 2011-09-07 23:22:40
我发现解决这个问题的最简单方法是使用本地安装的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) 。
如何修复
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)http.open('GET', 'http://127.0.0.1:5984/_all_dbs', true);
与http.open('GET', '/couchdb/_all_dbs', true);
现在就来试试,你会看到 '它的工作原理' 输出在JavaScript控制台(我用Firebug的控制台)
Eonil,我想跨域访问也是如此,但CouchDB不支持, 您可以投票支持该功能在此实施: https://issues.apache.org/jira/browse/COUCHDB-431
ps:该功能请求已在23/Jul/09创建:(我希望他们听到我们。
感谢你让我知道,我已经投票了!我认为HTTP REST协议功能就是这样一个语法糖的东西。应该同时提供方便的功能,但我不希望CouchDB的人这样做,因为我猜他们正在做某种业务已经不需要关心普通用户了,而且我建议你检查* OrientDB *为了提供快速,方便的HTTP REST接口,但我决定回到PostgreSQL – Eonil 2011-02-25 03:09:59
谢谢!我不知道OrientDB,它的功能列表看起来很有趣,在我的情况下,我发现HTTP REST有用(或需要)因为我打算使用jQuery从客户端浏览器访问数据库存储。我对CouchDB最为沮丧的是,使用MapReduce的静态视图是唯一的查询机制! – Benja 2011-02-28 04:45:30
我已经解决了,这是写一个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
我做了一个列表返回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+\");\";
}",
的CouchDB 1.3解决了这个与CORS:https://wiki.apache.org/couchdb/CORS
所有通过包管理器在debian/ubuntu上安装couchdb。截至今天(2014年10月10日),您将获得的版本是1.2,并且不支持CORS选项。如果你想使用它们,你必须从源代码安装从不版本。我花了一些时间才意识到为什么我的CORS设置不起作用,原因是我通过apt-get install couchdb安装了它,它的版本是1.2。 – szydan 2014-10-10 09:38:55
您应该启用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 = *
虽然这可以说是一个漏洞,你可能应该限制起源更多。
注意所有通过包管理器在debian/ubuntu上安装couchdb。截至今天(2014年10月10日),您将获得的版本是1.2,并且不支持CORS选项。如果你想使用它们,你必须从源代码安装从不版本。我花了一些时间才意识到为什么我的CORS设置不起作用,原因是我通过apt-get install couchdb安装了它,它的版本是1.2。 – szydan 2014-10-10 09:39:33
不幸的是,该链接现在已经死亡,并且返回一个404错误页面。 – MKroehnert 2013-09-04 12:03:19
@MKroehnert哦。而且让我发疯的是,我甚至不记得三年前我想做什么。 – Eonil 2013-09-04 17:31:31