nginx add_header werkt niet

Ik heb een intrigerend probleem waarbij wanneer ik add_headergebruik in mijn virtuele hostconfiguratie op een ubuntu-server met nginx met PHP en php-fpm, het gewoon niet werkt en ik heb geen idee wat ik doe het verkeerd. Hier is mijn configuratiebestand:

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;
}

Ik heb geprobeerd de koppen aan de andere locatiesecties toe te voegen, maar het resultaat is hetzelfde.

Alle hulp wordt gewaardeerd!!


Antwoord 1, autoriteit 100%

Er waren twee problemen voor mij.

Een daarvan is dat nginx alleen de laatsteadd_headerverwerkt die het in een boom ziet. Dus als je een add_headerin de server-context hebt, dan een andere in de locationgeneste context, zal het alleen de add_headerrichtlijn binnen de locationcontext. Alleen de diepste context.

Van de NGINX-documenten op add_header:

Er kunnen verschillende add_header-richtlijnen zijn. Deze richtlijnen worden overgenomen van het vorige niveau als en alleen als er geen add_header-richtlijnen zijn gedefinieerd op het huidige niveau.

Tweede probleem was dat de location / {}te blokkeren Ik had op zijn plaats was eigenlijk het verzenden van nginx naar de andere location ~* (\.php)$blok (omdat het zou voor alle aanvragen door index.php, en dat maakt eigenlijk nginx this phpblok) te verwerken repath. Dus, mijn add_headerrichtlijnen in de eerste plaats richtlijn waren nutteloos, en het begon te werken nadat ik alle richtlijnen die ik nodig had in de php locatie richtlijn.

Tot slot, hier is mijn werkende configuratie om CORS in het kader van een MVC framework genaamd Laravel toestaan ​​(je zou dit kunnen veranderen gemakkelijk aan een PHP framework dat moet passen index.phpals een centrale punt voor alle verzoeken).

server {
  root / pad / naar / app / publiek;
  index index.php;
  server_name test.dev;
  # Omleiding naar index.php
  plaats / {
    try_files $ uri $ uri / /index.php?$query_string;
  }
  # Passeren de PHP-scripts om FastCGI server luisteren op 127.0.0.1:9000
  locatie ~ \ .php $ {
    fastcgi_split_path_info ^ (+ \ php..) (/.+) $;
    # LET OP: U moet hebben "cgi.fix_pathinfo = 0;" in php.ini
    # Met php5-FPM:
    fastcgi_pass unix: /var/run/php5-fpm.sock;
    fastcgi_index index.php;
    fastcgi_params omvatten;
    # Cors configuratie
    # Witte lijst van toegestane domeinen via een reguliere uitdrukking
    # If ($ http_origin ~ * (http: // localhost (?: [0-9] +))) {
    if ($ http_origin ~ *. *) {# ja, voor lokale ontwikkeling. op maat van uw reguliere expressie als dat nodig is
       set $ cors "true";
    }
    # Blijkbaar, de drie volgende if-statements maken een vlag voor "compound voorwaarden"
    if ($ REQUEST_METHOD = opties) {
      set $ cors "opties $ {cors}";
    }
    if ($ REQUEST_METHOD = GET) {
      set $ cors "$ {cors} krijgen";
    }
    if ($ REQUEST_METHOD = POST) {
      set $ cors "$ {cors} post";
    }
    # Nu het verwerken van de vlag
    if ($ cors = 'trueget') {
      add_header 'Access-Control-Laat-Origin' "$ http_origin";
      add_header 'Access-Control-Sta-geloofsbrieven' 'waar';
    }
    if ($ cors = 'truepost') {
      add_header 'Access-Control-Laat-Origin' "$ http_origin";
      add_header 'Access-Control-Sta-geloofsbrieven' 'waar';
    }
    if ($ cors = 'trueoptions') {
      add_header 'Access-Control-Laat-Origin' "$ http_origin";
      add_header 'Access-Control-Sta-geloofsbrieven' 'waar';
      add_header 'Access-Control-Max-Age' 1728000; # Cache preflight waarde voor 20 dagen
      add_header 'Access-Control-Sta-methoden' 'GET, POST, OPTIES';
      add_header 'Access-Control-Sta-Headers' 'Authorization, Content-Type, Accepteren, Origin, User-Agent, DNT, Cache-Control, X-Mx-ReqToken, Keep-Alive, X-Gevraagde-With, If-Modified -Sinds';
      add_header 'Content-Length' 0;
      add_header 'Content-Type' 'text / plain charset = UTF-8';
      terugkeer 204;
    }
  }
  error_log /var/log/nginx/test.dev.error.log;
  toegang_log /var/log/nginx/test.dev.access.log;
}

De kern van de bovengenoemde ten: https://gist.github.com/adityamenon/6753574


Antwoord 2, Autoriteit 23%

Toen ik het testen van de bovenstaande add_headerinstellingen met:

# nginx -t && service nginx reload

Ik krijg

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

Dus de klacht wordt reagarding deze regel:

add_header PS 1

ontbreekt de puntkomma (;)

Om de headers te testen ik graag gebruik

# curl -I http://example.com

Volgens de ngx_http_headers_module handleiding

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

ik verder geprobeerd

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

in de context van http, serveren location, maar het verscheen alleen in de server-context .


Antwoord 3, autoriteit 23%

Ik had het probleem dat ik de responsheader niet kreeg omdat de responscode niet binnen het toegestane bereik viel, tenzij u het trefwoord “altijd” opgeeft na de headerwaarde.

Van de officiële documenten:

Voegt het opgegeven veld toe aan een responsheader, op voorwaarde dat de responscode gelijk is aan 200, 201, 204, 206, 301, 302, 303, 304, 307 of 308. De waarde kan variabelen bevatten.


Antwoord 4, autoriteit 5%

Laat me eerst zeggen dat ik na wat rondkijken op internet dit antwoord overal tegenkwam:

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

Ik heb echter besloten deze vraag met een apart antwoord te beantwoorden, omdat ik deze specifieke oplossing pas werkend kreeg nadat ik nog ongeveer tien uur had besteed aan het zoeken naar een oplossing.

Het lijkt erop dat Nginx standaard geen [juiste] lettertype-MIME-types definieert. Door deze handleidingte volgen, vond ik Ik zou het volgende kunnen toevoegen:

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

Naar mijn etc/nginx/mime.types-bestand. Zoals gezegd werkte bovenstaande oplossing toen. Uiteraard is dit antwoord gericht op het delen van lettertypen, maar het is vermeldenswaard dat de MIME-typen mogelijk niet zijn gedefinieerd in Nginx.


Antwoord 5

Blijkbaar is de add_header-overervings-quirk/gotcha ook van toepassing op de stroomopwaartse laag.

Ik had een script dat pre-autorisatieverzoeken voor een andere service deed en daarom retourneerde ik alle headers van de andere service.

Zodra ik begon met het toevoegen van een ‘Access-Control-Allow-Origin’-item samen met deze doorgestuurde headers, zou de browser het item daadwerkelijk krijgen en het verzoek toestaan.


Antwoord 6

Ik denk niet dat het goed werkt door ==> nginx -s herladen

Toen ik add_header gebruikte en vervolgens opnieuw laadde, veranderde er niets als reactie.
Maar toen ik een opzettelijke fout maakte en een 404-fout zag aan de kant van de klant,
en vervolgens mijn opzettelijke fout hersteld en opnieuw geladen, Add_header werkte.


Antwoord 7

Wat zegt uw nginx-foutlogboek?

Weet u welke add_header-regels de configuratie verbreken? Zo niet, becommentarieer ze dan allemaal en schakel ze vervolgens 1 voor 1 in, herlaad nginx om te zien welke het probleem is/zijn. Ik zou beginnen met commentaar te geven op het blok:

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

Het probleem kan zijn dat u headers instelt die niet worden ondersteund door de kern-httpHeaders-module. Het kan handig zijn om de NginxHttpHeadersMoreModulete installeren.

Probeer ook de twee add_headerregels int de location ~* \...te vervangen door het volgende:

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

Is er een reden dat je de gzip-configuratie hier hebt en niet in je globale nginx.conf?


Antwoord 8

Het blijkt dat het proberen om nginx bij te werken naar de nieuwste versie dit veroorzaakte. Ik had eerder geprobeerd opnieuw te installeren, wat het correct leek te herinstalleren, maar eigenlijk verwijderde Ubuntu nginx niet goed. Ik hoefde dus alleen de Ubuntu-server opnieuw te installeren en alles opnieuw te installeren met alleen de standaard ubuntu-repositories.

Other episodes