Nginx-Konfiguration übergibt Fastcgi-Parameter und schreibt je nach Speicherort neu

0

Ich suche einen Weg, um Nginx mit der PHP-Anwendung zu konfigurieren.

Es sollte statische Dateien liefern, falls vorhanden. Wenn sie sich im Unterordner / dev befinden, sind sie nur für die Version 127.0.0.1 zulässig.

Eine URL, die keine statische Datei ist, sollte über den dritten Location Block zu PHP umgeleitet werden.

Wenn dieses uri, das zu php geht, mit / dev beginnt, möchte ich, dass das uri ohne das / dev umgeschrieben wird und das fastcgi_param APP_ENV auf "dev" gesetzt wird. (Und auch für alle außer 127.0.0.1 gesperrt sein)

Wenn diese URI nicht mit / dev beginnt, möchte ich fastcgi_param APP_ENV auf "prod" setzen, ohne es neu zu schreiben.

server {
    root /var/www/homeserver/public;

    location /dev {
        allow 127.0.0.1;
        deny all;

        # This has no effect on the third location block:
        fastcgi_param APP_ENV dev;

        # This is only OK for when try_files pass the uri to /index.php
        rewrite ^/dev(.*)$ /$1 last; 

        try_files $uri /index.php$is_args$args;
    }

    location / {
        # This has no effect on the third location block:
        fastcgi_param APP_ENV prod; 

        try_files $uri /index.php$is_args$args;
    }

    # Front controler :
    location ~ ^/index\.php(/|$) {
        fastcgi_pass unix:/var/run/php/php7.1-fpm.sock;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        include fastcgi_params;        

        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        fastcgi_param DOCUMENT_ROOT $realpath_root;

        internal;
    }

    location ~ \.php$ {
        return 404;
    }
}

Ich habe versucht, dies mit "if" -Anweisungen zu lösen. Ohne Erfolg.

Wie kann ich es konfigurieren?

elsässisch
quelle

Antworten:

1

Probieren Sie diese Konfiguration aus (ich habe sie nicht getestet, aber ich hoffe, sie sollte tun, was Sie wollen).

server {
    root /var/www/homeserver/public;

    location /dev {
        allow 127.0.0.1;
        deny all;

        rewrite ^/dev/(.*)$ /$1 break; 

        try_files $uri $uri/ /index.php$is_args$args;

        location ~* [^/]\.php(/|$) {
            gzip off;
            expires off; ## Do not cache dynamic content
            fastcgi_intercept_errors on;

            fastcgi_pass unix:/var/run/php/php7.1-fpm.sock;
            fastcgi_split_path_info ^(.+?\.php)(/.*)$;
            if (!-f $document_root$fastcgi_script_name) {
              return 404 "Error 404 Not found. (err#002)";
            }

            include fastcgi_params;
            fastcgi_param APP_ENV dev;
            fastcgi_index index.php;
            fastcgi_param HTTP_PROXY "";  # Mitigate https://httpoxy.org/ vulnerabilities
            fastcgi_param SCRIPT_FILENAME $request_filename;
            # fastcgi_param DOCUMENT_ROOT $realpath_root; # DOCUMENT_ROOT already specified in fastcgi_params
        }
    }

    location / {
        try_files $uri $uri/ /index.php$is_args$args;

        location ~* [^/]\.php(/|$) {
            gzip off;
            expires off; ## Do not cache dynamic content
            fastcgi_intercept_errors on;

            fastcgi_pass unix:/var/run/php/php7.1-fpm.sock;
            fastcgi_split_path_info ^(.+?\.php)(/.*)$;
            if (!-f $document_root$fastcgi_script_name) {
              return 404 "Error 404 Not found. (err#001)";
            }

            include fastcgi_params;
            fastcgi_param APP_ENV prod;
            fastcgi_index index.php; 
            fastcgi_param HTTP_PROXY "";  # Mitigate https://httpoxy.org/ vulnerabilities
            fastcgi_param SCRIPT_FILENAME $request_filename;
            # fastcgi_param DOCUMENT_ROOT $realpath_root; # DOCUMENT_ROOT already specified in fastcgi_params
        }
    }
}
Alex
quelle
OK, aber ist es nicht möglich, die Konfiguration mit nur einem ".php" -Standortblock zu vereinfachen?
Elsässer
Sie können, aber wie der Autor von nginx auf einigen Konferenzen sagte, - es ist in Ordnung und sogar ratsam, die Copy-Paste-Methode in nginx-Konfigurationen zu verwenden, anstatt zu versuchen, sie logisch zu organisieren. Um besser zu verstehen, wie Nginx-Prozessanweisungen ausgeführt werden, müssen Sie wissen, in welcher Phase Anweisungen ausgeführt werden. Um ein fehlerfreies und vorhersehbares Verhalten von nginx zu gewährleisten, ist es für Sie und nginx besser, die Aufmerksamkeit auf jeden einzelnen Ort zu richten, anstatt ein bestimmtes Muster wie beim Programmieren zu verwenden, indem Sie Dinge an einem einzigen Verarbeitungsort kombinieren
Alex