nginx add_header not working

后端 未结 8 804
无人共我
无人共我 2020-12-23 16:00

I am having an intriguing problem where whenever I use add_header in my virtual host configuration on an ubuntu server running nginx with PHP and php-fpm it sim

8条回答
  •  生来不讨喜
    2020-12-23 16:40

    There were two issues for me.

    One is that nginx only processes the last add_header it spots down a tree. So if you have an add_header in the server context, then another in the location nested context, it will only process the add_header directive inside the location context. Only the deepest context.

    From the NGINX docs on add_header:

    There could be several add_header directives. These directives are inherited from the previous level if and only if there are no add_header directives defined on the current level.

    Second issue was that the location / {} block I had in place was actually sending nginx to the other location ~* (\.php)$ block (because it would repath all requests through index.php, and that actually makes nginx process this php block). So, my add_header directives inside the first location directive were useless, and it started working after I put all the directives I needed inside the php location directive.

    Finally, here's my working configuration to allow CORS in the context of an MVC framework called Laravel (you could change this easily to fit any PHP framework that has index.php as a single entry point for all requests).

    server {
        root /path/to/app/public;
        index index.php;
    
        server_name test.dev;
    
        # redirection to index.php
        location / {
            try_files $uri $uri/ /index.php?$query_string;
        }
    
        # 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-fpm:
            fastcgi_pass unix:/var/run/php5-fpm.sock;
            fastcgi_index index.php;
            include fastcgi_params;
    
            # cors configuration
            # whitelist of allowed domains, via a regular expression
            # if ($http_origin ~* (http://localhost(:[0-9]+)?)) {
            if ($http_origin ~* .*) { # yeah, for local development. tailor your regex as needed
                 set $cors "true";
            }
    
            # apparently, the following three if statements create a flag for "compound conditions"
            if ($request_method = OPTIONS) {
                set $cors "${cors}options";
            }
    
            if ($request_method = GET) {
                set $cors "${cors}get";
            }
    
            if ($request_method = POST) {
                set $cors "${cors}post";
            }
    
            # now process the 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 value for 20 days
                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;
            }
        }
    
        error_log /var/log/nginx/test.dev.error.log;
        access_log /var/log/nginx/test.dev.access.log;
    }
    

    The gist for the above is at: https://gist.github.com/adityamenon/6753574

提交回复
热议问题