2016-08-04 2 views
0

У меня есть сервер узлов с API hapiJS, и я пытаюсь отправить его запросы с отдельного сервера Node.Nginx + HapiJS Запрос CORS (не GET)

Все работает отлично в разработке, но не на серверах, и проблема заключается в том, что на серверах включена базовая авторизация.

В частности, запросы работают нормально, если они являются запросами GET, но все остальные запросы терпят неудачу. I подозреваемый это связано с непредвиденным пролетом рейса OPTIONS, который не отправляется по запросам GET из моего ограниченного понимания.

Точное сообщение об ошибке я получаю:

Нет 'Access-Control-Allow-Origin' заголовок присутствует на запрошенный ресурс. Происхождение 'https://site.example.com', следовательно, не допускается. Ответ был HTTP код статуса 401.

Мой Nginx конфигурации:

server { 
    listen 80; 
    server_name https://api.example.com; 
    return 301 https://$server_name$request_uri; ## Permanently redirect all http traffic to https 
} 
server { 

    #SSL INIT 
    listen 443; 
    ssl on; 
    ssl_certificate /var/vcap/jobs/nginx/config/site.bundle.crt; 
    ssl_certificate_key /var/vcap/jobs/nginx/config/site.key; 

    server_name https://api.example.com; 

    location/{ 
    auth_basic "Restricted Content"; 
    auth_basic_user_file .htpasswd; 
    proxy_set_header X-Real-IP $remote_addr; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header Host $http_host; 
    proxy_set_header X-NginX-Proxy true; 
    proxy_pass_request_headers on; 
    proxy_pass https://api.example.com; 
    } 

} 

И мои CORS настройки для HapiJS (я исключил ненужную вещи).

connections: 
    routes: 
    cors: 
     origin: ["https://api.example.com"] 
     credentials: true 

Я попытался https://www.npmjs.com/package/hapi-cors-headers Хапи-CORS-заголовки плагина, но безрезультатно (вместо указанных выше параметров.) Я пытался что позволяет каждую CORS вещи на Nginx я мог думать (большинство из них получило от http://enable-cors.org/server_nginx.html)

Одна из двух вещей не происходит, независимо от того, как я настроил конфигурацию - и я попробовал много вещей: 1) Он продолжает давать вышеуказанное сообщение, независимо от того, что 2) Он жалуется в заголовке есть TWICE (если я поместил его как в nginx, так и в hapijs одновременно).

Ни в коем случае не работает (кроме запросов GET).

Пример POST AJAX вызова к API, который я использую (используется с кендо):

$.ajax({ 
    url: api_address + '/vendors', 
    method: 'POST', 
    contentType: 'application/json', 
    processData: false, 
    data: JSON.stringify(this.vendor), 
    xhrFields: { 
     withCredentials: true 
    } 
    success: function(data) { 

     vm.set('vendor', data); 
     notification.show('Vendor created successfully', 'success'); 
     vm.set('has_changes', false); 
    }, 
    error: function() { 
     notification.show('Error creating vendor', 'error'); 
    } 
}); 

api_address упоминалось выше:

https://username:[email protected] 

Почему это работает Запросы GET, но не POST/PUT/etc?

ответ

0

Измените свой nginx на управление CORS и не беспокойтесь о нем. Взятые и редактировался http://enable-cors.org/server_nginx.html

location/{ 
    add_header 'Access-Control-Allow-Origin' '*'; 
    add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; 
    add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type'; 

    if ($request_method = 'OPTIONS') { 
     # 
     # Tell client that this pre-flight info is valid for 20 days 
     # 
     add_header 'Access-Control-Max-Age' 1728000; 
     add_header 'Content-Type' 'text/plain charset=UTF-8'; 
     add_header 'Content-Length' 0; 
     return 204; 
    } 
    auth_basic "Restricted Content"; 
    auth_basic_user_file .htpasswd; 
    proxy_set_header X-Real-IP $remote_addr; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header Host $http_host; 
    proxy_set_header X-NginX-Proxy true; 
    proxy_pass_request_headers on; 
    proxy_pass https://api.example.com; 
} 

Конечно вам потребуется больше усилий, если вы поддерживаете PUT или DELETE.

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

  • Нет связанных вопросов^_^