通过重写的URL访问Couch DB数据库URL,并使用查询参数

时间:2011-02-20 19:40:57

标签: couchdb

我的网站用完了Couch数据库实例,因此我将vhost配置为指向/dbname/_design/app/_rewrite

我希望能够从Web浏览器访问索引页面,同时仍然通过Ajax访问Couch DB API,因此我在rewrites字段中设置了一对重写规则:

[ { "from": "/dbname/*", "to: ../../*" },
  { "from": "/*", "to: *" } ]

这些规则可以正常使用:我可以通过/dbname/docname网址访问单个文档,我可以将网络浏览器指向网站的根目录并以这种方式访问​​我的附件。

我现在想要访问数据库本身的信息,以便将since参数传递给_changes API。

  1. /dbname/工作正常
  2. /dbname/?name=value无法正确重定向。在Couch DB日志中,我看到'GET' /dbname/_design/..?name=value 404之类的行,而我希望看到'GET' /dbname/?name=value 200
  3. 来自IE的Ajax需要第二种情况,其中jquery.couch.js代码添加了一个伪查询字符串以避免缓存。

    如何判断我的重写规则,以便Couch DB正确重写/dbname/?name=value

    修改:为了澄清,只要在网址中的最后一个/后面有内容,查询字符串就可以正常工作。

    • /dbname/docname?rev=xxx正常工作
    • /dbname/_changes?since=1正常工作
    • /dbname/?_=dummy不起作用;它会重写为/dbname/_design/..?_=dummy

1 个答案:

答案 0 :(得分:11)

我试图复制你的问题,但它正在运作。以下是我的互动。 (注意,我使用IP地址127.0.0.1:5984来确保没有vhost /重写问题,然后我通过localhost:5984访问“生产”网站。

有一个错误似乎将查询参数附加到以“..”结尾的重写。它不会写入../?key=val,而是写入CouchDB不解析的..?key=val

我认为没有必要使用参数查询数据库URL。因此,一种解决方法是始终确保您永远不会这样做。 (例如,如果你盲目地将no-op参数附加到所有查询以简化代码,你必须改变它。)

另一种解决方法是启用重写根CouchDB URL 。这需要将/_config/httpd/secure_rewrites设置为false

{ "from":"/api/*", "to":"../../../*" }

现在您可以查询http://localhost:5984/api/x?key=valhttp://localhost:5984/api/x/_changes?since=5。 (您无法使用参数查询根URL - 它仍然是错误,但在交通较少的地方。)

以下是最初的终端会议:

$ 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}