4

別のドメインから 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
4

2 に答える 2

2

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]

最初の RewriteRule はすべてのリクエストをキャッチし、空白の 204 を返します。これは、CORSリクエストOPTIONSを続行しても問題ないことをクライアントに伝えます。POSTそうでない場合、OPTIONSリクエストは CouchDB に転送され、CouchDB は 405 で応答します。これは、CouchDB 構成で許可するメソッドに関係なく行われます。

これがあなたの特定のケースに役立つことを願っています。

于 2016-11-26T19:45:10.340 に答える