2015-01-15 6 views
13

Ich versuche, CORRS-Anweisung zu meiner nginx-Datei für so einfache statische HTML-Site hinzufügen. (Aus hier http://enable-cors.org/server_nginx.html)Nginx Config für Cors - Anweisung add_header ist nicht erlaubt

Gäbe es einen Grund geben, warum es über die erste add_header Richtlinie sagen ‚add_header“ Richtlinie erlaubt ist nicht hier‘

Meine Konfigurationsdatei Probe

server { 
    if ($http_origin ~* (https?://[^/]*\.domain\.com(:[0-9]+)?)$) { 
     set $cors "true"; 
    } 

    if ($request_method = 'OPTIONS') { 
     set $cors "${cors}options"; 
    } 

    if ($request_method = 'GET') { 
     set $cors "${cors}get"; 
    } 
    if ($request_method = 'POST') { 
     set $cors "${cors}post"; 
    } 

    if ($cors = "trueget") { 
     add_header 'Access-Control-Allow-Origin' "$http_origin"; 
     add_header 'Access-Control-Allow-Credentials' 'true'; 
    } 

    if ($cors = "truepost") { 
     add_header 'Access-Control-Allow-Origin' "$http_origin"; 
     add_header 'Access-Control-Allow-Credentials' 'true'; 
    } 

    if ($cors = "trueoptions") { 
     add_header 'Access-Control-Allow-Origin' "$http_origin"; 
     add_header 'Access-Control-Allow-Credentials' 'true'; 
     add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; 
     add_header 'Access-Control-Allow-Headers' 'Authorization,Content-Type,Accept,Origin,User-Agent,DNT,Cache-Control,X-Mx-ReqToken,Keep-Alive,X-Requested-With,If-Modified-Since'; 
     add_header 'Content-Length' 0; 
     add_header 'Content-Type' 'text/plain charset=UTF-8'; 
     return 204; 
    } 

    listen 8080; 

    location/{ 
     root /var/www/vhosts/mysite; 
    } 
} 

Antwort

19

add_header beschweren entweder unter http, server hat location oder if in location Block platziert werden.

Du Platzierung in unter if in server. Verschieben Sie sie unter dem location Block.

server { 


    listen 8080; 

    location/{ 
     root /var/www/vhosts/mysite; 

     if ($http_origin ~* (https?://[^/]*\.domain\.com(:[0-9]+)?)$) { 
      set $cors "true"; 
     } 

     if ($request_method = 'OPTIONS') { 
      set $cors "${cors}options"; 
     } 

     if ($request_method = 'GET') { 
      set $cors "${cors}get"; 
     } 
     if ($request_method = 'POST') { 
      set $cors "${cors}post"; 
     } 

     if ($cors = "trueget") { 
      add_header 'Access-Control-Allow-Origin' "$http_origin"; 
      add_header 'Access-Control-Allow-Credentials' 'true'; 
     } 

     if ($cors = "truepost") { 
      add_header 'Access-Control-Allow-Origin' "$http_origin"; 
      add_header 'Access-Control-Allow-Credentials' 'true'; 
     } 

     if ($cors = "trueoptions") { 
      add_header 'Access-Control-Allow-Origin' "$http_origin"; 
      add_header 'Access-Control-Allow-Credentials' 'true'; 
      add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; 
      add_header 'Access-Control-Allow-Headers' 'Authorization,Content-Type,Accept,Origin,User-Agent,DNT,Cache-Control,X-Mx-ReqToken,Keep-Alive,X-Requested-With,If-Modified-Since'; 
      add_header 'Content-Length' 0; 
      add_header 'Content-Type' 'text/plain charset=UTF-8'; 
      return 204; 
     } 
    } 
} 

Quelle: http://nginx.org/en/docs/http/ngx_http_headers_module.html#add_header

+0

Dies gilt nicht perfekt funktionieren, wenn überhaupt. Siehe https://www.nginx.com/resources/wiki/start/topics/depth/ifisevil/. –

5

Die Regel if in location kann durch einige Tricks umgangen werden, so dass Sie müssen nicht schreiben/include CORS Regeln in jedem Block location. Diese

server { 
    set $cors_origin ""; 
    set $cors_cred ""; 
    set $cors_header ""; 
    set $cors_method ""; 

    if ($http_origin ~* "^http.*\.yourhost\.com$") { 
      set $cors_origin $http_origin; 
      set $cors_cred true; 
      set $cors_header $http_access_control_request_headers; 
      set $cors_method $http_access_control_request_method; 
    } 

    add_header Access-Control-Allow-Origin  $cors_origin; 
    add_header Access-Control-Allow-Credentials $cors_cred; 
    add_header Access-Control-Allow-Headers  $cors_header; 
    add_header Access-Control-Allow-Methods  $cors_method; 
} 

funktioniert, weil nginx nicht einen Header zurück, wenn ihr Wert einen leeren String. Zum einen

+0

Das funktioniert tatsächlich. Sollte mehr Kredit bekommen. Der add_header ist eigentlich wählerisch, er erlaubt 'add_header X-Content-Type-Optionen nosniff;' außerhalb eines Standortblocks, bläst aber einen Fehler aus, wenn es sich um einen 'Access-control- *' handelt. Ältere Versionen von nginx akzeptieren diese auch. –

3

, lassen Sie mich sagen, dass rund um die Bahn nach dem suchen, ich diese Antwort gefunden tauchen überall:

location ~* \.(eot|ttf|woff|woff2)$ { add_header Access-Control-Allow-Origin *; }

Allerdings habe ich beschlossen, diese Frage mit einer separaten Antwort zu beantworten, da ich nur geschafft um diese spezielle Lösung zu erhalten, nachdem Sie nach weiteren zehn Stunden nach einer Lösung gesucht haben.

Es scheint, dass Nginx standardmäßig keine [korrekten] Schriftart-MIME-Typen definiert. Durch this tuorial folgenden fand ich mich folgendes könnte hinzufügen:

application/x-font-ttf   ttc ttf; 
application/x-font-otf   otf; 
application/font-woff   woff; 
application/font-woff2   woff2; 
application/vnd.ms-fontobject eot; 

Zu meiner etc/nginx/mime.types Datei.

Wie erwähnt, funktionierte die obige Lösung dann. Offensichtlich zielt diese Antwort auf das Teilen von Zeichensätzen ab, aber es ist definitiv eine Überprüfung wert, um zu sehen, ob der MIME-Typ (korrekt) für jede andere Ressource definiert ist, mit der Sie ebenfalls zu kämpfen haben.

Verwandte Themen