nginx: Wie kann man 404 direkt in einem Reverse-Proxy nur für bestimmte Dateinamen (*.txt) behandeln?

nginx: Wie kann man 404 direkt in einem Reverse-Proxy nur für bestimmte Dateinamen (*.txt) behandeln?

Ich habe ein komplexes nginxSetup, bei dem eine Front nginxan den Ports 80 und 443 alle externen Zugriffe einschließlich TLS handhabt.

Für Dateien im /textsFrontend-nginx wird die Anfrage an ein zweites Backend-nginx weitergeleitet, das in einem komplizierten Prozess im laufenden Betrieb vorhandene Textdateien ändert und dabei CPU und andere Ressourcen verbraucht.

Bei Dateien *.txt, die nicht existieren (404), möchte ich das Backend überhaupt nicht belästigen, sondern dem Client stattdessen /texts/default.txtdirekt eine Standarddatei bereitstellen. Derzeit werden nicht existierende Dateien jedoch immer noch nur in der error_page 404Zeile des Backends behandelt. Existierende Dateien werden problemlos bereitgestellt, der Proxy funktioniert.

Dies ist meine Konfiguration:

frontend-nginx.conf:
http {
    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    types_hash_max_size 2048;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;
    include /etc/nginx/conf.d/*.conf;

    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  frontend.example.org;
        root         /srv/www;

        location /texts/ {

            location ~ \*.txt$ {
                root /srv/www/backend;

                ####### the next line has absolutely no effect
                try_files $uri /texts/default.txt;
            }

            proxy_pass          http://localhost:90;
            proxy_redirect      http://localhost:90/ /;
            proxy_set_header    Host             $host;
            proxy_set_header    X-Real-IP        $remote_addr;
            proxy_set_header    X-Forwarded-For  $proxy_add_x_forwarded_for;
            proxy_set_header    X-Client-Verify  SUCCESS;
            proxy_set_header    Upgrade          $http_upgrade;
            proxy_set_header    Connection       "upgrade";
            proxy_http_version  1.1;

            proxy_redirect off;
        }
    }
    # https goes here, all the same except TLS
}
backend-nginx.conf:
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;

    server {
        listen       127.0.0.1:90;

        root /srv/www/backend;
        charset utf-8;

        expires -1;  # no-cache
        location ~ /..*\.txt$ {
            # longer cache time for text files
            expires 10m;

            # this actually works but only here in the backend
            error_page  404 @404;
        }

        location @404 {
            return 302 $scheme://frontend.example.org/texts/default.txt
        }
    }
}

Ich habe diese nutzlose Anweisung in der Frontend-Konfigurationsdatei, die für mich so aussieht, als ob sie 404-Weiterleitungen verarbeiten könnte, default.txtaber wenn ich das tue

wget -v http://frontend.example.org/texts/notexist.txt

Ich erhalte eine Weiterleitung nur innerhalb des Backends (es findet also ein Proxying statt).

Antwort1

location /texts/ {
    proxy_set_header ...;
    proxy_pass ...;

    location ~ \.txt$ {
        root /path/to/root;
        try_files $uri /texts/default.txt;
        proxy_pass ...;
    }
}
location = /texts/default.txt {
    root /path/to/root;
}

Beachten Sie den korrekten regulären Ausdruck für die locationAnweisung. Die proxy_set_headerAnweisungen werden übernommen, aber die proxy_passAnweisung muss in der verschachtelten Anweisung wiederholt werden location.

Die try_filesAnweisung überprüft, ob die Datei existiert, und ändert die URI, wenn sie nicht existiert.

Die Standarddatei verfügt über ein dediziertes Verzeichnis location, sodass die Datei als statische Datei vom richtigen Stammverzeichnis aus bereitgestellt werden kann.

Der Pfad zur Datei wird durch Verketten des Wertes von rootmit der URI erstellt, sodass sich die Datei /texts/default.txtunter befindet /path/to/root/texts/default.txt.

verwandte Informationen