it-swarm.com.de

nginx add_header funktioniert nicht

Ich habe ein faszinierendes Problem. Wenn ich add_header in meiner virtuellen Host-Konfiguration auf einem Ubuntu-Server mit nginx mit PHP und php-fpm verwende, funktioniert es einfach nicht und ich habe keine Ahnung, was ich falsch mache. Hier ist meine Konfigurationsdatei:

server {
    listen   80; ## listen for ipv4; this line is default and implied
    #listen   [::]:80 default ipv6only=on; ## listen for ipv6

    root /var/www/example.com/webroot/;
    index index.html index.htm index.php;

    # Make site accessible from http://www.example.com/
    server_name www.example.com;

    # max request size
    client_max_body_size 20m;

    # enable gzip compression
    gzip             on;
    gzip_static      on;
    gzip_min_length  1000;
    gzip_proxied     expired no-cache no-store private auth;
    gzip_types       text/plain text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript;

    add_header 'Access-Control-Allow-Origin' '*';
    add_header 'Access-Control-Allow-Credentials' 'true';
    add_header 'Access-Control-Allow-Headers' 'Authorization,Content-Type,Accept,Origin,User-Agent,DNT,Cache-Control,X-Mx-ReqToken';
    add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE';
    add_header PS 1

    location / {
            # First attempt to serve request as file, then
            # as directory, then fall back to index.html
            try_files $uri $uri/ /index.php?$query_string;
            # Uncomment to enable naxsi on this location
            # include /etc/nginx/naxsi.rules
    }


    location ~* \.(css|js|asf|asx|wax|wmv|wmx|avi|bmp|class|divx|doc|docx|eot|exe|gif|gz|gzip|ico|jpg|jpeg|jpe|mdb|mid|midi|mov|qt|mp3|m4a|mp4|m4v|mpeg|mpg|mpe|mpp|odb|odc|odf|odg|odp|ods|odt|ogg|ogv|$
            # 1 year -> 31536000
            expires 500s;
            access_log off;
            log_not_found off;
            add_header Pragma public;
            add_header Cache-Control "max-age=31536000, public";
    }
    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    location ~ \.php$ {
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini

            # With php5-cgi alone:
            #fastcgi_pass 127.0.0.1:9000;
            # With php5-fpm:
            fastcgi_pass unix:/var/run/example.sock;
            fastcgi_index index.php?$query_string;
            include fastcgi_params;

            # instead I want to get the value from Origin request header
    }

    # Deny access to hidden files
    location ~ /\. {
            deny all;
            access_log off;
            log_not_found off;
    }

    error_page 403 /403/;
}

server {
    listen 80;
    server_name example.com;
    rewrite     ^ http://www.example.com$request_uri? permanent;
}

Ich habe versucht, die Header zu den anderen Standortabschnitten hinzuzufügen, aber das Ergebnis ist das gleiche.

Jede Hilfe geschätzt !!

44
Petar Vasilev

Es gab zwei Probleme für mich.

Zum einen verarbeitet nginx nur den lastadd_header, den es in einem Baum aufspürt. Wenn Sie also einen add_header im server-Kontext haben, dann einen anderen im location-geschachtelten Kontext, wird die add_header-Direktive nur im location-Kontext verarbeitet. Nur der tiefste Kontext.

Aus den NGINX-Dokumenten auf add_header :

Es kann mehrere add_header-Direktiven geben. Diese Direktiven werden genau dann von der vorherigen Ebene geerbt, wenn auf der aktuellen Ebene keine add_header-Direktiven definiert sind. 

Das zweite Problem war, dass der location / {}-Block, den ich an Ort und Stelle hatte, tatsächlich Nginx an den anderen location ~* (\.php)$-Block sendete (da er alle Anforderungen durch index.php umleiten würde, was dazu führt, dass nginx diesen php-Block verarbeitet). Meine add_header-Direktiven in der ersten location-Direktive waren also unbrauchbar und sie funktionierten, nachdem ich alle Direktiven in die php-Direktive aufgenommen hatte.

Zum Schluß noch meine Arbeitskonfiguration, um CORS im Kontext eines MVC-Frameworks namens Laravel zuzulassen (Sie könnten dies leicht ändern, um in jedes PHP -Framework zu passen, das index.php als einen einzigen Einstiegspunkt für alle Anforderungen hat).

 Server {
 root /path/to/app/public ;
 index index.php; 

 Servername test.dev; 

 # Weiterleitung zu index.php 
 Standort/{
 try_files $ uri $ uri//index.php?$query_string ;
 } 

 # übergeben Sie die PHP -Skripts an den FastCGI-Server, der 127.0.0.1:9000.__ abhört. Speicherort ~\.php $ {
 fastcgi_split_path_info ^ (. + \. php) (/.+) $; 
 # HINWEIS: Sie sollten "cgi.fix_pathinfo = 0;" in php.ini 

 # Mit php5-fpm: 
 fastcgi_pass unix: /var/run/php5-fpm.sock; 
 fastcgi_index index.php; 
 include fastcgi_params; 

 # cors Konfiguration 
 # Whitelist der erlaubten Domänen über einen regulären Ausdruck 
 # if ($ http_Origin ~ * (http: // localhost (: [0-9] +)?)) {
 if ($ http_Origin ~ *. *) {# yeah, für lokale Entwicklung. Passen Sie Ihren Regex nach Bedarf an 
 Setze $ cors auf "true"; 
 } 

 # anscheinend erstellen die folgenden drei if-Anweisungen ein Flag für "zusammengesetzte Bedingungen" 
 if ($ request_method = OPTIONS) {
 Setze $ cors "$ {cors} Optionen"; 
 } 

 if ($ request_method = GET) {
 Setze $ cors "$ {cors} get"; 
 } 

 if ($ request_method = POST) {
 Setze $ cors "$ {cors} post"; 
 } 

 # Verarbeitet jetzt das Flag 
 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-Max-Age' 1728000; # Cache-Preflight-Wert für 20 Tage 
 add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; 
 add_header 'Access-Control-Allow-Headers' 'Autorisierung, Inhaltstyp, Akzeptieren, Herkunft, Benutzer-Agent, DNT, Cache-Control, X-Mx-ReqToken, Keep-Alive, X-Requested-With, falls geändert -Schon seit';

 add_header 'Content-Length' 0; 
 add_header 'Content-Type' 'text/plain charset = UTF-8'; 
 return 204; 
 } 
 } 

 error_log /var/log/nginx/test.dev.error.log ;
 access_log /var/log/nginx/test.dev.access.log ;
}

Die Gist für das oben Genannte ist unter: https://Gist.github.com/adityamenon/6753574

78
Aditya M P

Wenn ich die obigen add_header-Einstellungen teste mit:

# nginx -t && service nginx reload

Ich bekomme

nginx: [emerg] directive "add_header" is not terminated by ";" in
/etc/nginx/enabled-sites/example.com.conf:21

nginx: configuration file /etc/nginx/nginx.conf test failed

Die Beschwerde geht also auf diese Linie ein:

add_header PS 1

fehlt das Semikolon (;)

Um die Header zu testen, benutze ich gerne

# curl -I http://example.com

Gemäß dem Handbuch ngx_http_headers_module

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

Ich habe es weiter versucht

add_header X-test-A 1;
add_header "X-test-B" "2";
add_header 'X-test-C' '3';

im Kontext von http, server und location, die jedoch nur im Kontext server angezeigt wurden.

23
birgire

Ich hatte das Problem, den Antwortheader nicht zu erhalten, da der Antwortcode nicht im zulässigen Bereich liegt, es sei denn, Sie geben das Schlüsselwort "always" nach dem Headerwert an.

Aus den offiziellen Dokumenten:

Fügt das angegebene Feld einem Antwortheader hinzu, vorausgesetzt der Antwortcode ist 200, 201, 204, 206, 301, 302, 303, 304, 307 oder 308. Der Wert kann Variablen enthalten.

11
Didier Breedt

Lassen Sie mich zunächst sagen, dass ich, nachdem ich mich im Web umgesehen habe, diese Antwort überall gefunden hat:

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

Ich habe mich jedoch entschlossen, diese Frage mit einer separaten Antwort zu beantworten, da ich diese spezielle Lösung erst nach etwa zehn weiteren Stunden auf der Suche nach einer Lösung zum Laufen brachte.

Es scheint, dass Nginx standardmäßig keine [korrekten] Schrifttyp-MIME-Typen definiert. Mit folgendem diesem Tutorial konnte ich folgendes 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;

In meine etc/nginx/mime.types-Datei. Wie gesagt, die obige Lösung funktionierte dann. Offensichtlich zielt diese Antwort darauf ab, Schriftarten gemeinsam zu nutzen, aber es ist erwähnenswert, dass die MIME-Typen möglicherweise nicht in Nginx definiert werden.

3
DazBaldwin

Die add_header-Vererbungskennzeichnung gilt selbstverständlich auch für die vorgelagerte Ebene.

Ich hatte ein Skript zur Vorautorisierung von Anforderungen, das für einen anderen Dienst gedacht war, und gab daher alle Header des anderen Dienstes zurück.

Nachdem ich mit den weitergeleiteten Kopfzeilen einen Eintrag "Access-Control-Allow-Origin" hinzugefügt hatte, erhielt der Browser den Eintrag und ließ die Anfrage zu.

1
CNSKnight

Was sagt Ihr Nginx-Fehlerprotokoll?

Wissen Sie, welche add_header-Zeilen die Konfiguration beschädigen? Wenn nicht, kommentieren Sie sie alle aus und aktivieren Sie sie 1 nach 1. Laden Sie nginx erneut, um zu sehen, welche (n) das Problem ist/sind. Ich würde zunächst den Block auskommentieren:

add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Headers' 'Authorization,Content-Type,Accept,Origin,User-Agent,DNT,Cache-Control,X-Mx-ReqToken';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE';
add_header PS 1

Das Problem könnte sein, dass Sie Header setzen, die nicht vom httpHeaders-Kernmodul unterstützt werden. Die Installation von NginxHttpHeadersMoreModule kann hilfreich sein.

Versuchen Sie auch, die beiden add_header-Zeilen im location ~* \... durch Folgendes zu ersetzen:

add_header Pragma '';
add_header Cache-Control 'public, max-age=31536000'

Gibt es einen Grund, warum Sie die gzip-Konfiguration hier haben und nicht in Ihrer globalen nginx.conf?

0
tseven