Подтвердить что ты не робот

URL-адрес базы данных Access Couch DB через перезаписанный URL-адрес, с параметрами запроса

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

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

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

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

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

  • /dbname/ отлично работает
  • /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
4b9b3361

Ответ 1

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

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

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

Другим обходным решением является перезаписать корневой URL 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-адрес с параметрами — он по-прежнему является ошибкой, но в месте с меньшим количеством жертв.)

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

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