Cors CouchDB中的_用户数据库不允许使用HTTP选项方法

Cors CouchDB中的_用户数据库不允许使用HTTP选项方法,cors,couchdb,preflight,Cors,Couchdb,Preflight,我试图在从另一个域连接到CouchDB的应用程序中更改用户的密码。我的代码与中的示例大致相同,即获取文档,更改数据,然后发送一个包含更改的PUT请求。PUT请求出现问题-由于CORS,浏览器尝试在发送PUT请求之前执行选项请求,但选项请求返回405 Method Not Allowed 有人知道如何避开这件事吗 以下是请求标题,以防有所帮助: OPTIONS /_users/org.couchdb.user:clinic_admin HTTP/1.1 Host: localhost:15984

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

有人知道如何避开这件事吗

以下是请求标题,以防有所帮助:

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

我没有直接连接到CouchdB实例,而是使用Apache作为代理,这允许更大的灵活性。CouchDB有时会完全禁止选项请求(例如,
\u bulk\u docs
只允许POST,这会导致405个错误,完全阻止复制)。为了在执行CORS请求时避免这种情况,我将以下规则添加到配置代理的
.htaccess
文件中:

# ALWAYS ALLOW PREFLIGHT REQUESTS (COUCHDB FORBIDS THIS RESPONSE FOR _bulk_docs)
RewriteCond %{REQUEST_METHOD} OPTIONS
RewriteRule ^(.*)$ $1 [R=204,L]

# Continue with RewriteRules for the CouchDB URLs you want to proxy
# plus whatever authorization headers you might want to add
RewriteRule db/(.*) http://couch.url:5984/database/$1 [P]
第一个重写规则捕获所有
选项
请求,并返回一个空白204,告诉客户端可以继续他们的CORS
POST
请求。如果不是这样,那么
选项
请求将转发给CouchDB,CouchDB将以405进行回复。无论您在CouchDB配置中允许使用什么方法,它都会这样做


希望这对您的具体案例有所帮助。

这里有两种选择。我更喜欢选项2,但我先从选项1开始

选项1:正确配置CORS CouchDB中的405个错误通常是由于配置错误造成的,例如,没有包括所有可能的头和方法,如果您想支持所有浏览器/设备,其中有很多头和方法

在PouchDB团队中,我们将“最佳实践”汇集到一个模块中:,该模块应适用于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

这会解决你的问题;如果没有,请查看成功使用此方法对运行在
localhost:5984
上的数据库进行测试的测试(包括更改用户密码,这正是您尝试执行的操作)

选项2:使用反向代理避免CORS 这确实是最好的选择。它之所以更好,有几个原因:

  • 花几分钟配置Apache/nginx以完全避免CORS,省去以后让CORS正常工作时的麻烦
  • CORS的性能不如无CORS,因为浏览器需要执行飞行前选项请求,这会增加额外的延迟,尤其是在复制期间
  • 这在移动混合应用程序中也更容易实现;Cordova必须将某些域列入白名单并避免COR
  • 我通常使用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;
    }
    
    请注意,这可能会破坏
    /\u 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选项更灵活。

    只需注意选项1-而
    向CouchDB添加cors
    是一个很棒的工具,请注意,
    \u bulk\u docs
    端点不响应全局配置(至少在我的测试中)
    \u bulk\u docs
    不允许
    选项
    请求,因此如果让CouchDB在没有代理的情况下处理CORS请求,CORS复制将失败。要测试这一点,请在终端中尝试以下操作,并注意HTTP 405错误响应:
    curl'http://127.0.0.1:5984/database/_bulk_docs'-X选项-v