Couchdb 使用查询参数通过重写的URL访问数据库URL

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访问单个文档,我可

我的网站没有了coach DB实例,因此我将vhost配置为指向
/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
  • IE中的Ajax需要第二种情况,
    jquery.coach.js
    代码添加了一个伪查询字符串以避免缓存

    如何表述我的重写规则,以便coach DB正确地重写
    /dbname/?name=value

    编辑:为了澄清,只要URL中最后一个/后面有内容,查询字符串就可以正常工作

    • /dbname/docname?rev=xxx
      有效
    • /dbname/\u更改?因为=1
      起作用
    • /dbname/?\uq=dummy
      不工作;它重写为
      /dbname/\u design/。?\u=dummy

    我试图复制您的问题,但它正在工作。下面是我的互动。(注意,我使用IP地址
    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问题。