cors - CouchDB 中的 _users 数据库不允许使用 HTTP OPTIONS 方法

标签 cors couchdb preflight

我正在尝试从从另一个域连接到 CouchDB 的应用程序中更改用户密码。我的代码或多或少与 CouchDB Docs 中的示例相同。 ,即获取文档,更改数据,然后将更改的 PUT 请求发回。 PUT 请求出现问题 - 由于 CORS,浏览器在发送 PUT 请求之前尝试执行 OPTIONS 请求,但 OPTIONS 请求返回 405 Method Not Allowed。

有谁知道如何解决这个问题?

以下是请求 header 以防万一:

OPTIONS /_users/org.couchdb.user:clinic_admin HTTP/1.1
Host: localhost:15984
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
Access-Control-Request-Method: PUT
Origin: https://localhost:15000
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36
Access-Control-Request-Headers: content-type, if-match
Accept: */*
Referer: https://localhost:15000/webapp/
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8,ja;q=0.6,sv;q=0.4,zh-CN;q=0.2

最佳答案

这里有两个选项。我更喜欢选项#2,但我将从#1 开始。

选项 1:正确配置 CORS

CouchDB 中的 405 错误通常是由于配置错误造成的,例如不包括所有可能的 header 和方法,如果您想支持所有浏览器/设备,其中有很多。

在 PouchDB 团队中,我们将“最佳实践”集中到一个模块中:add-cors-to-couchdb ,它应该适用于 CouchDB 1.6.1 和 CouchDB 2.0。赶紧跑:

npm install --global add-cors-to-couchdb
add-cors-to-couchdb http://example.com:5984 -u admin_username -p admin_password

这应该可以解决您的问题;如果没有,请查看 PouchDB 的测试或 pouchdb-authentication它成功地使用此方法针对运行在 localhost:5984 的数据库进行测试(包括更改用户的密码,这是您正在尝试做的)。

选项 2:使用反向代理避免 CORS

这确实是最好的选择。它更好有几个原因:
  • 花几分钟配置 Apache/nginx 来完全避免 CORS,以后尝试让 CORS 正常工作就可以省去你的麻烦
  • CORS 的性能不如 no-CORS,因为浏览器需要执行预检 OPTIONS 请求,这会增加额外的延迟,尤其是在复制期间
  • 这在移动混合应用程序中也更容易; Cordova 有 a one-liner option将某些域列入白名单并避免 CORS。

  • 我通常使用 Nginx as a reverse proxy CouchDB 指南和路由到在 example.com/couchdb 上运行的数据库.例如。:
    location /couchdb {
        rewrite /couchdb/(.*) /$1 break;
        proxy_pass http://localhost:5984;
        proxy_redirect off;
        proxy_buffering off;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
    

    请注意,这可能会破坏 /_utils (Futon/Fauxton),但在这些情况下最好的办法是通过 SSH 设置到您的服务器的反向隧道并在本地查看它:
    ssh -L3000:localhost:5984 user@example.com
    # now open localhost:3000/_utils in a browser
    

    无论如何,您可能不希望 Futon/Fauxton 暴露在世人面前。

    这里的优点是您可以使用 Nginx/Apache 阻止 CouchDB 的某些方法或某些部分,这通常比 CouchDB 中可用的 HTTP 选项更灵活。

    关于cors - CouchDB 中的 _users 数据库不允许使用 HTTP OPTIONS 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32304973/

    相关文章:

    javascript - Whatwg-fetch 为什么在预检时不包含凭据(选项)

    javascript - angularjs 预检响应具有无效的 HTTP 状态代码 404

    javascript - 如何在 Adob​​e Media Server 中允许来自 Javascript 的 CORS 请求

    Couchdb超慢查看,100% cpu使用率

    javascript - 如何在 Node.js 中从 CouchDB 数据库获取文档

    Apigee 飞行前选项请求

    javascript - 邪恶的 Firefox 错误 -- "A parameter or an operation is not supported by the underlying object"

    javascript - 如何将大文件(pdf)存储到浏览器文件系统中

    google-chrome - Chrome 不缓存预检