Доступ к URL базы данных Couch DB через переписанный URL с параметрами запроса - PullRequest
12 голосов
/ 20 февраля 2011

На моем веб-сайте заканчивается экземпляр Couch DB, поэтому мой vhost настроен на указание /dbname/_design/app/_rewrite.

Я хочу иметь возможность доступа к странице индекса из веб-браузера, при этом все еще обращаясь к API Couch DB через Ajax, поэтому я настроил пару правил перезаписи в моем поле rewrites:

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

Эти правила работают нормально: я могу получить доступ к отдельным документам через /dbname/docname URL, и я могу указать свой веб-браузер на корень сайта и таким образом получить доступ к своим вложениям.

Теперь я хотел бы получить доступ к информации о самой базе данных, чтобы передать параметр since в API _changes.

  1. /dbname/ отлично работает
  2. /dbname/?name=value не перенаправляет должным образом. В журнале Couch DB я вижу строки типа 'GET' /dbname/_design/..?name=value 404, тогда как я ожидаю увидеть 'GET' /dbname/?name=value 200.

Второй случай необходим для Ajax из IE, где код jquery.couch.js добавляет ложную строку запроса, чтобы избежать кэширования.

Как мне сформулировать правила переписывания, чтобы Couch DB правильно переписывал /dbname/?name=value?

Редактировать: Для пояснения, строки запроса работают нормально, если после последнего / в URL есть что-то.

  • /dbname/docname?rev=xxx работает
  • /dbname/_changes?since=1 работает
  • /dbname/?_=dummy не работает; переписывается на /dbname/_design/..?_=dummy

1 Ответ

11 голосов
/ 21 февраля 2011

Я пытался продублировать вашу проблему, но она работает. Ниже мое взаимодействие. (Обратите внимание, что я использую IP-адрес 127.0.0.1:5984, чтобы избежать проблем с vhost / rewrite, затем я получаю доступ к «производственному» сайту через localhost:5984.

Есть ошибка Похоже, что параметры запроса добавляются к перезаписи, заканчивающейся на "..". Вместо записи в ../?key=val он записывает в ..?key=val, который CouchDB не анализирует.

Я не думаю, что нужно запрашивать URL базы данных с параметрами. Таким образом, один из обходных путей - всегда следить за тем, чтобы вы никогда этого не делали. (Например, если вы слепо добавляете параметры no-op ко всем запросам, чтобы упростить код, вам придется это изменить.)

Другой обходной путь - разрешить перезапись на корневой каталог CouchDB . Для этого необходимо установить /_config/httpd/secure_rewrites в false.

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

Теперь вы можете запросить http://localhost:5984/api/x?key=val или http://localhost:5984/api/x/_changes?since=5. (Вы не можете запросить корневой URL с параметрами & mdash; это все еще ошибка, но в менее посещаемом месте.)

Ниже приводится начальный сеанс терминала:

$ 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}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...