2010-07-30 4 views
11

В настоящее время веб-приложения должны предложить какое-то заголовок HTTP междоменном для доступа к данным на другом домене: http://openfontlibrary.org/wiki/Web_Font_linking_and_Cross-Origin_Resource_SharingCouchDB междоменный доступ из XMLHttpRequest?

Есть ли способ настроить CouchDB для поддержки неограниченного доступа междоменного? (он может использовать apache httpd внутренне). Я использую только внутреннюю цель db.

+0

К сожалению, эта ссылка уже мертва и возвращает страницу ошибки 404. – MKroehnert

+0

@MKroehnert Oh. И это заставляет меня сходить с ума, что я даже не могу вспомнить, что я хотел сделать три года назад. – Eonil

ответ

8

Вы можете использовать функцию show CouchDB для установки заголовка Access-Control-Allow-Origin.


function(doc, req) { 
    return { 
    body : 'whatever', 
    headers : { 
     "Access-Control-Allow-Origin": "\"*\"" 
    } 
    } 
} 

Более подробную информацию о шоу функций здесь: http://guide.couchdb.org/draft/show.html

+0

это, к сожалению, не поддерживает POST, PUT и DELETE :(есть способ поддержать эти методы? –

14

Самый простой способ я нашел, чтобы решить это с помощью локально установленные веб-сервер Apache с поддержкой mod_proxy модулем и сконфигурированный PROXYPASS директиву.

Пусть начать с базовой настройки

index.html имеет следующее содержание

<html> 
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js" type="text/javascript"></script> 
<script type="text/javascript"> 

var http = XMLHttpRequest(); 
http.open('GET', 'http://127.0.0.1:5984/_all_dbs', true); // ! WE WILL CHANGE THIS LINE 
http.onreadystatechange = function() { 
    if (http.readyState == 4 && http.status == 200) { 
     console.debug('it works'); 
    } 
}; 
http.send(null) 
</script> 
<head><title>Test Access to CouchDB</title></head> 
<body> 
</body> 
</html> 

Если вы попробуете это только сейчас он не будет работать из-за проблемы перекрестного домена (в данном случае порты не совпадают 8181! = 5984) ,

Как это исправить

  • настроить Apache (apache_home/CONF/httpd.conf)
    • раскомментируйте LoadModule proxy_module modules/mod_proxy.so
    • раскомментируйте LoadModule proxy_http_module modules/mod_proxy_http.so
    • добавить ProxyPass /couchdb http://127.0.0.1:5984 (как рейтинг верхнего уровня у как ServerAdmin)
    • перезапуск Apache
  • изменения индекса.HTML
    • заменить http.open('GET', 'http://127.0.0.1:5984/_all_dbs', true); с http.open('GET', '/couchdb/_all_dbs', true);

Попробуйте сейчас, и вы должны увидеть 'это работает' выход в консоли JavaScript (я использовал Firebug консоль)

3

Eonil, я хочу Междоменный доступ тоже, но не поддерживается CouchDB, , вы можете проголосовать за эту функцию, которая будет реализована здесь: https://issues.apache.org/jira/browse/COUCHDB-431

ps: этот запрос функции был создан 23/Jul/09 :(Надеюсь, они нас услышат.

+0

Спасибо, что сообщили мне об этом. Я проголосовал! Я считаю, что функция протокола HTTP REST - это просто синтаксические сахара удобная функция должна предлагаться одновременно, но я не ожидаю, что люди CouchDB сделают это, потому что я предполагаю, что они делают какой-то бизнес, уже не нужно заботиться о обычных пользователях. И я рекомендую вам проверить * OrientDB * также для быстрого и удобного HTTP REST-интерфейса.Однако я решил вернуться к PostgreSQL – Eonil

+0

Спасибо! Я не знал о OrientDB, список функций кажется очень интересным. В моем случае я нашел HTTP REST полезным (или обязательным) поскольку я планирую получить доступ к хранилищу db из клиентского браузера с помощью jQuery. То, что я нахожу наиболее увлекательным в CouchDB, состоит в том, что статические представления с использованием MapReduce являются единственным механизмом запроса! – Benja

1

Так я решил это написать 2 строки Rebol обертку CGI, а затем попросить моего Ajax в Jquery назвать мой CGI вместо URL для получения данных из CouchDB:

Rebol [ 

    {wrapper to overcome cross-domain fetching of data from couchdb} 
] 
print "Content-type: application/json^/" ;text/plain^/" 
print read http://127.0.0.1:5984/syncspace/_design/vals/_view/xxxx?group=true 
1

Я сделал список, который возвращает JSONP ... но все-таки только для чтения поддержки

"jsonp": "function(head, req) { 
    var row; 
    var rows=[]; 
    while(row = getRow()){ 
     rows.push(row); 
    } 
    rj = JSON.stringify({\"rows\" : rows,\"total_rows\":rows.length}); 
    return req.query.callback+\"(\"+rj+\");\"; 
}", 
4

CouchDB 1,3 решает эту проблему с CORS: https://wiki.apache.org/couchdb/CORS

+0

Уведомление для все устанавливают couchdb на debian/ubuntu через диспетчера пакетов. На сегодняшний день (10 октября 2014 года) версия, которую вы получите, составляет 1,2, и она НЕ поддерживает варианты CORS. Если вы хотите их использовать, вам необходимо установить версию без источников из источников. Мне потребовалось немного понять, почему мои настройки CORS не работают, и причина в том, что я установил его через apt-get install couchdb, и это была версия 1.2. – szydan

3

вы должны позволить CORS in CouchDB> 1.3. Это так же просто, как редактирование default.ini и установка enable_cors = true, а затем изменение origins в разделе [cors], чтобы получить нужные URL-адреса верхнего уровня. Например, я должен был сделать следующее, чтобы включить белый список моего локального сервера.

enable_cors = true 
[cors] 
origins = http://127.0.0.1:9000 

полностью ответить на этот вопрос, хотя вы хотите установить

origins = * 

хотя это можно утверждать, что уязвимость, и вы, вероятно, следует ограничить происхождение больше.

+0

Уведомление обо всех установках couchdb на debian/ubuntu через диспетчер пакетов. На сегодняшний день (10 октября 2014 года) версия, которую вы получите, составляет 1,2, и она НЕ поддерживает варианты CORS.Если вы хотите их использовать, вам необходимо установить версию без источников из источников. Мне потребовалось немного понять, почему мои настройки CORS не работают, и причина в том, что я установил его через apt-get install couchdb, и это была версия 1.2. – szydan

Смежные вопросы