Couchdb 使用查询参数通过重写的URL访问数据库URL
我的网站没有了coach DB实例,因此我将vhost配置为指向Couchdb 使用查询参数通过重写的URL访问数据库URL,couchdb,Couchdb,我的网站没有了coach DB实例,因此我将vhost配置为指向/dbname/\u design/app/\u rewrite 我希望能够从web浏览器访问索引页,同时仍然通过Ajax访问Coach DB API,因此我在我的rewrites字段中设置了一对重写规则: [ { "from": "/dbname/*", "to: ../../*" }, { "from": "/*", "to: *" } ] 这些规则运行良好:我可以通过/dbname/docnameURL访问单个文档,我可
/dbname/\u design/app/\u rewrite
我希望能够从web浏览器访问索引页,同时仍然通过Ajax访问Coach DB API,因此我在我的rewrites
字段中设置了一对重写规则:
[ { "from": "/dbname/*", "to: ../../*" },
{ "from": "/*", "to: *" } ]
这些规则运行良好:我可以通过/dbname/docname
URL访问单个文档,我可以将web浏览器指向网站的根目录,并通过这种方式访问我的附件
现在我想访问数据库本身的信息,以便将since
参数传递给\u changes
API
/dbname/
工作正常/dbname/?name=value
无法正确重定向。在coach DB日志中,我看到了类似于'GET'/dbname/_design/.?name=value 404
,而我希望看到'GET'/dbname/?name=value 200
jquery.coach.js
代码添加了一个伪查询字符串以避免缓存
如何表述我的重写规则,以便coach DB正确地重写/dbname/?name=value
编辑:为了澄清,只要URL中最后一个/后面有内容,查询字符串就可以正常工作
有效/dbname/docname?rev=xxx
起作用/dbname/\u更改?因为=1
不工作;它重写为/dbname/?\uq=dummy
/dbname/\u design/。?\u=dummy
127.0.0.1:5984
,以确保没有vhost/rewrite问题,然后通过localhost:5984
访问“生产”站点
有一个bug它似乎将查询参数附加到以“.”结尾的重写中。它不是重写到。/?key=val
,而是写入CouchDB不解析的。?key=val
我认为没有必要使用参数来查询数据库URL。因此,一种解决方法是始终确保您永远不会这样做。(例如,如果您盲目地在所有查询中添加任何op参数以简化代码,则必须对其进行更改。)
另一个解决方法是启用对根CouchDB URL的重写。这需要将/\u config/httpd/secure\u rewrites
设置为false
{ "from":"/api/*", "to":"../../../*" }
现在您可以查询http://localhost:5984/api/x?key=val
或http://localhost:5984/api/x/_changes?since=5
(您无法使用参数查询根URL,这仍然是一个bug,但位于流量较小的地方。)
以下是初始终端会话:
$ mkdir t
$ cd t
$ curl -XDELETE 127.0.0.1:5984/x
{"ok":true}
$ curl -XPUT 127.0.0.1:5984/x
{"ok":true}
$ curl 127.0.0.1:5984
{"couchdb":"Welcome","version":"1.0.1"}
$ echo -n _design/test > _id
$ mkdir shows
$ echo 'function() { return "hello world!\n" }' > shows/hello.js
$ cat > rewrites.json
[ { "from":"/db/*", "to":"../../*" }
, { "from":"/*" , "to":"*"}
]
$ echo '{}' > .couchapprc
$ couchapp push http://127.0.0.1:5984/x
$ curl -XPUT http://127.0.0.1:5984/_config/vhosts/localhost:5984 -d '"/x/_design/test/_rewrite"'
"/x/_design/test/_rewrite"
$ curl localhost:5984 # This is the design document.
{"_id":"_design/test","_rev":"1-e523efd669aa5375e711f8e4b764da7a","shows":{"hello":"function() { return \"hello world!\\n\" }"},"couchapp":{"signatures":{},"objects":{},"manifest":["rewrites.json","shows/","shows/hello.js"]},"rewrites":[{"to":"../../*","from":"/db/*"},{"to":"*","from":"/*"}]}
$ curl localhost:5984/_show/hello
hello world!
$ curl localhost:5984/db # This is the DB.
{"db_name":"x","doc_count":1,"doc_del_count":0,"update_seq":1,"purge_seq":0,"compact_running":false,"disk_size":4185,"instance_start_time":"1298269455135987","disk_format_version":5,"committed_update_seq":1}
$ curl localhost:5984/db/_changes
{"results":[
{"seq":1,"id":"_design/test","changes":[{"rev":"1-e523efd669aa5375e711f8e4b764da7a"}]}
],
"last_seq":1}
$ curl localhost:5984/db/_changes?since=1 # Parameters accepted!
{"results":[
],
"last_seq":1}
很抱歉,我无法提供帮助。最有趣的是您的做法。我希望按照您的解决方案提交一个错误鉴于上述数据库,如果您查询
localhost:5984/db/?dummy=1
,会发生什么情况?您是对的。这看起来可能是一个重写器错误。我将用一些变通方法修改我的答案。谢谢您的建议-我将省略问题它引起问题的字符串。它是由Futon/_utils/script/jquery.coach.js脚本添加的。当您使用IE时,它会向所有CouchDB调用添加一个?\u=
参数,显然是为了阻止IE缓存响应。它引起问题的地方是\u changes
API,jquery.coach.js首先在这里查询/dbname/
URL以获取update\u seq
.PS我可能会尝试将数据库API隐藏在一些更新和显示函数后面,以避免奇怪的.././重写。但是,在这种情况下,我不清楚如何访问\u changes
API。不过,我可以就此开始一个新的SO问题。