2013-12-06 4 views
13

Я разрабатываю приложение ember.js с брандом laravel. Я пытаюсь вернуть коды ошибок http с php, если что-то пойдет не так. Я заметил, что когда выдает запрос PUT и возвращает код состояния 400, мои заголовки CORS игнорируются моим файлом conf, который разбивает мой внешний интерфейс. Я понятия не имею, почему компилятор PUT/400 делает nginx игнорировать мой conf. Любая помощь приветствуется.nginx добавить заголовки при возврате 400 кодов

server { 
    listen    *:80 ; 

    server_name   userchamp.com; 
    access_log   /var/log/nginx/embertest.com.access.log; 

    location/{ 

    root /var/www/embertest/public; 
    try_files $uri $uri/ /index.php?$args ; 
    index index.html index.htm index.php; 

    } 

    location ~ \.php$ { 

     if ($request_method = 'OPTIONS') { 

     add_header 'Access-Control-Allow-Origin' '*'; 
     add_header 'Access-Control-Allow-Credentials' 'true'; 
     add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS'; 
     add_header 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type'; 
     add_header 'Access-Control-Max-Age' 1728000; 
     add_header 'Content-Type' 'text/plain charset=UTF-8'; 
     add_header 'Content-Length' 0; 

     return 204; 
    } 

    if ($request_method = 'POST') { 

     add_header 'Access-Control-Allow-Origin' '*'; 
     add_header 'Access-Control-Allow-Credentials' 'true'; 
     add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS'; 
     add_header 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type'; 

    } 

    if ($request_method = 'PUT') { 

     add_header 'Access-Control-Allow-Origin' '*'; 
     add_header 'Access-Control-Allow-Credentials' 'true'; 
     add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE OPTIONS'; 
     add_header 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type'; 
    } 
    if ($request_method = 'GET') { 

     add_header 'Access-Control-Allow-Origin' '*'; 
     add_header 'Access-Control-Allow-Credentials' 'true'; 
     add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS'; 
     add_header 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type'; 

    } 

    if ($request_method = 'DELETE') { 

     add_header 'Access-Control-Allow-Origin' '*'; 
     add_header 'Access-Control-Allow-Credentials' 'true'; 
     add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS'; 
     add_header 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type'; 

    } 
    root /var/www/embertest/public; 
    try_files $uri $uri/ /index.php?$args ; 
    index index.html index.htm index.php; 
    fastcgi_index index.php; 
    fastcgi_param PATH_INFO $fastcgi_path_info; 
    fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info; 
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
    fastcgi_param APP_ENV dev; 
    fastcgi_param  APP_DBG true; 
    fastcgi_pass unix:/var/run/php5-fpm.sock; 
    fastcgi_split_path_info ^(.+\.php)(/.+)$; 
    include fastcgi_params; 
    } 
} 

ответ

19

Update: Для Nginx> = 1.7.5

Append "всегда" для определения заголовка:

add_header 'Access-Control-Allow-Origin' '*' всегда;

Для Nginx < 1.7.5

Согласно Nginx официального документа ngx_header_module, то add_header не может работать, если код ответа 400

syntax:  add_header name value; 
default: — 
context: http, server, location, if in location 


Adds the specified field to a response header provided that the response code equals 
200, 201, 204, 206, 301, 302, 303, 304, or 307. A value can contain variables. 

По-другому, вы можете попробовать HttpHeadersMoreModule, который является более мощным.

+1

Большое спасибо - я столкнулся с этим сегодня. – JasonG

+36

Если вы используете nginx> = 1.7.5, вы можете добавить третий параметр с именем «always», и он будет работать даже с кодами ответов на ошибки. – simon

7

Я думаю @simon при условии, правильный ответ:

При использовании Nginx> = 1.7.5, вы можете добавить третий параметр с именем «всегда».

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