1 votes

Nginx try_files ne fonctionne pas à l'intérieur du bloc serveur

http {
include mime.types;
default_type application/octet-stream;

server {
    root /websites;
    listen 80;
    server_name localhost;

    # ne fonctionne pas
    try_files /logo.png /logo.jpg /error;

    # fonctionne
    rewrite ^/e /error;

    # fonctionne
    # return 200 "$request_uri Géré par le bloc serveur";

    location / {
        default_type text/plain;
        return 200 "Préfixe racine correspondant";
    }

    location /error {
        default_type text/plain;
        return 404 "Logo non trouvé";
    }
}

Je veux savoir quelle est la cause de cette évaluation, je n'ai trouvé aucune explication fiable ni dans la documentation ni sur les forums.

En passant, j'ai expérimenté le scénario suivant:

  • Suppression du bloc location / {} et cela a fonctionné comme prévu. Je sais que lorsque la demande est faite au serveur, elle est d'abord évaluée par le bloc serveur et ensuite correspond aux blocs location. Mais il semble que la directive try_files soit ignorée (POURQUOI?!!). Si je comprends bien, le dernier argument de la directive try_files réécrit l'URI donc il devrait se comporter comme la directive rewrite. Les directives rewrite et return ont fonctionné comme prévu, elles ont été évaluées à chaque fois indépendamment de l'existence de blocs location correspondants ou non.

J'ai beaucoup recherché pour trouver des informations fiables expliquant cette situation, mais je n'ai pas réussi. Donc je demande ici la réponse ou la source sur les informations internes de Nginx à quelqu'un qui sait.

0 votes

Votre hypothèse selon laquelle "elle est d'abord évaluée par le bloc serveur" n'est pas correcte.

0 votes

@RichardSmith. Merci pour votre attention. Pouvez-vous s'il vous plaît expliquer pourquoi?

1 votes

@SafarSafarli En plus de ce qui a déjà été dit par Richard Smith, vous devez savoir qu'il existe différentes phases de traitement des demandes. Consultez la documentation de développement de nginx ou cet article pour plus d'informations. Les directives du module de réécriture ngx_http_rewrite_module placées au niveau du serveur sont traitées pendant la NGX_HTTP_SERVER_REWRITE_PHASE tandis que la directive try_files est traitée pendant la NGX_HTTP_PRECONTENT_PHASE.

0voto

HugoFS Points 313

Consultez comment nginx traite une demande. Mais je vais ajouter quelques réserves qui abordent spécifiquement votre question et sont facilement observables mais qui peuvent ne pas être bien documentées.

Vous mentionnez les directives rewrite et return, mais celles-ci appartiennent au ngx_http_rewrite_module qui a ses propres règles d'évaluation et ne se comportent pas de la même manière que les directives principales. Vous avez raison de dire que rewrite et return dans le contexte server peuvent s'exécuter avant que le bloc location ne soit sélectionné.

Comme vous l'avez observé (à l'exception du ngx_http_rewrite_module), le contexte server agit comme la location par défaut, c'est-à-dire, s'il n'y a pas d'autre bloc location correspondant à la demande. La présence d'un bloc explicite location / { ... } prendra toujours le dessus.

0 votes

J'ai compris, mais ma question concerne principalement la directive "try_files". Pouvez-vous fournir plus d'informations à ce sujet. Dans ce cas, dans le contexte du serveur. Merci

0 votes

Je n'ai plus d'informations, comme je l'ai dit c'est un comportement observé.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X