Luk*_*ord 3 couchdb cors preflight
我正在尝试从连接到另一个域的CouchDB的应用程序中更改用户的密码.我的代码或多或少与CouchDB Docs中的示例相同,即获取文档,更改数据,然后发送带有更改的PUT请求.PUT请求发生问题 - 由于CORS,浏览器在发送PUT请求之前尝试执行OPTIONS请求,但OPTIONS请求返回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
Run Code Online (Sandbox Code Playgroud)
这里有两个选择.我更喜欢选项#2,但我会从#1开始.
CouchDB中的405错误通常是由于配置错误造成的,例如不包括所有可能的标头和方法,如果您想支持所有浏览器/设备,那么它们有很多.
在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
Run Code Online (Sandbox Code Playgroud)
这应该可以解决你的问题; 如果没有,请查看PouchDB的测试或pouchdb-authentication,它们成功地使用此方法来测试运行的数据库localhost:5984(包括更改用户密码,这是您正在尝试做的事情).
这真是最好的选择.这有几个原因更好:
我通常使用Nginx作为 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;
}
Run Code Online (Sandbox Code Playgroud)
请注意,这可能会破坏/_utils(Futon/Fauxton),但在这种情况下最好的办法是通过SSH建立到服务器的反向隧道,并在本地查看:
ssh -L3000:localhost:5984 user@example.com
# now open localhost:3000/_utils in a browser
Run Code Online (Sandbox Code Playgroud)
你可能不希望Futon/Fauxton无论如何都要暴露在这个世界里.
这里的优点是你可以使用Nginx/Apache阻止某些方法或CouchDB的某些部分,这通常比CouchDB中的HTTP选项更灵活.
我没有直接连接到 CouchdB 实例,而是使用 Apache 作为代理,这提供了更多的灵活性。CouchDB 有时会完全禁止 OPTIONS 请求(例如,_bulk_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]
Run Code Online (Sandbox Code Playgroud)
第一个 RewriteRule 捕获所有OPTIONS请求并返回空白 204,这告诉客户端可以继续处理其 CORSPOST请求。如果不是这种情况,OPTIONS请求将被转发到 CouchDB,CouchDB 将回复 405。无论您在 CouchDB 配置中允许什么方法,它都会执行此操作。
希望这对您的具体案例有所帮助。
| 归档时间: |
|
| 查看次数: |
2623 次 |
| 最近记录: |