Pourquoi la directive proxy_intercept_errors de Nginx nécessite-t-elle une réécriture pour fonctionner correctement?

8

Voici un exemple de configuration de serveur Nginx. Sans le bloc d'emplacement "talisman magique", le contenu d'erreur mandaté entraîne une page Nginx 404 plutôt que la page d'erreur personnalisée servie.

La suppression de la directive proxy_intercept_errors sert une page d'erreur proxy appropriée avec des en-têtes de code d'erreur http appropriés.

Les pages d'erreur non proxy sont restituées correctement indépendamment de la présence du talisman magique.

Des idées sur ce qui se passe exactement?

server {
    server_name     mydomain.com "";
    listen          80;
    root            /var/www;
    error_page      400 401 402 403 404 500 501 502 503 504 /admin/error_page.htm;
    proxy_intercept_errors on;

    location /proxy/ {
        proxy_read_timeout  60s;
        proxy_set_header    Host $host;
        proxy_pass          http://myservers;
    }

    location /test404/ {
        return 404;
    }

    location /admin/ {    # this line constitute a magical talisman that fixes proxied error interception(???)(!)
        rewrite ^(/admin)(.*)$ /admin$2 break;
    }
}
Aubrey Falconer
la source

Réponses:

4

Je suis désolé que cette réponse arrive tardivement, mais pour l'instant, avec la version stable actuelle v1.8.1, la configuration que vous avez fournie devrait fonctionner sans aucun talisman .

Si vous avez fourni la version sur laquelle vous expérimentiez, ce serait une idée de voir si un bogue a été corrigé ou si la configuration était défectueuse.

Je vous suggère de vérifier votre configuration, car vous n'avez certainement pas besoin de cet /admin/emplacement ni de sa rewritedirective contenue . Faites très attention à supprimer tout ce qui ne fait pas partie de ce test (et que vous ne montrez pas) car cela pourrait interférer.

En dernier recours, vous pouvez essayer l'extrait de configuration suivant, testé avec succès, et intégrer lentement les modifications et voir à quel moment les résultats divergent des attentes:

server {
    listen      80;
    listen      [::]:80;
    server_name example.org;

    location /proxy {
        return 418 "Host: $host, Connection: $http_connection";
    }
}

server {
    listen      80;
    listen      [::]:80;
    server_name example.com;

    root /var/ious/files;

    error_page 418 = /error_page.html;
    proxy_intercept_errors on;

    location /proxy {
        proxy_pass http://example.org;
    }
}
Bernard Rosset
la source
Merci Bernard. Je marque votre réponse comme acceptée car suffisamment de temps s'est écoulé pour que je ne me souvienne plus de la version de Nginx contre laquelle je testais lorsque la question d'origine a été posée.
Aubrey Falconer