2 votes

nginx infinite 302 Found redirect loop

J'utilise nginx pour mapper plusieurs domaines à google app engine. Dans ce cas précis, j'associe plusieurs domaines au moteur d'applications Google. même locataire . il y a une configuration dans mon code qui sait quel domaine est le domaine principal et quand une demande arrive, je vérifie si l'hôte est le domaine principal et si ce n'est pas le cas, je redirige vers le domaine principal.

par exemple, disons que www.aaa.com est le domaine défini par défaut

aaa.com     -> www.aaa.com
www.bbb.com -> www.aaa.com
ccc.com     -> www.aaa.com
...

ce qui arrive de temps en temps, c'est qu'une url javascript entre dans une boucle de redirection sur nginx. Notez que la requête n'atteint jamais Appengine. Nginx crée cette boucle. 302 Found boucle. Cela s'est produit deux fois au cours des deux dernières semaines.

le chemin de la requête ressemble à www.aaa.com/22/foobar.js où la première partie du chemin est le numéro de version du fichier javascript.

un fichier css avec le même format uri www.aaa.com/22/foobar.css n'aura pas cette boucle de redirection.

si je déploie une nouvelle version, le fichier sera à nouveau serveur correctement. donc déployer une version 23 et l'accès à www.aaa.com/23/foobar.js travaillerait à nouveau. De plus, si j'utilise un cachebuster sur la requête, comme par exemple www.aaa.com/22/foobar.js?345 Le redémarrage de nginx ou même le redémarrage de la machine où nginx est exécuté n'aide pas. L'installation d'une nouvelle machine avec la même configuration exacte sert le fichier sans problème.

Alors qu'est-ce qui pourrait causer cette boucle de redirection ? Comment puis-je m'en débarrasser une fois qu'elle se produit ? Y a-t-il un cache sur nginx (je sais que nginx ne fait pas de cache par défaut) que je ne connais pas ? La machine met-elle en cache ces redirections ?

voici mon nginx.conf

user nginx;
worker_processes 2;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;
events {
    worker_connections 1024;
}

http {
    include /etc/nginx/mime.types;
    default_type application/octet-stream;
    server_names_hash_max_size 1024;
    server_names_hash_bucket_size 128;
    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';

    access_log /var/log/nginx/access.log main;
    sendfile on;

    keepalive_timeout 65;
    # enable gzip compression
    gzip on;
    gzip_min_length 1100;
    gzip_buffers 4 32k;
    gzip_comp_level 5;
    gzip_types text/plain application/x-javascript text/xml text/css;
    gzip_vary on;

    server {
        server_name www.aaa.com;

        location / {
            resolver 8.8.8.8;
            proxy_pass http://tenantname.myappid.appspot.com/$request_uri;
            proxy_set_header Host tenantname.myappid.appspot.com;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header NexHost $scheme://$host;
            proxy_redirect http://tenantname.myappid.appspot.com/ /;
            proxy_intercept_errors on;
        }
    }

    server {
        server_name aaa.com;

        location / {
            resolver 8.8.8.8;
            proxy_pass http://tenantname.myappid.appspot.com/$request_uri;
            proxy_set_header Host tenantname.myappid.appspot.com;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header NexHost $scheme://$host;
            proxy_redirect http://tenantname.myappid.appspot.com/ /;
            proxy_intercept_errors on;
        }
    }

    server {
        server_name www.bbb.com;

        location / {
            resolver 8.8.8.8;
            proxy_pass http://tenantname.myappid.appspot.com/$request_uri;
            proxy_set_header Host tenantname.myappid.appspot.com;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header NexHost $scheme://$host;
            proxy_redirect http://tenantname.myappid.appspot.com/ /;
            proxy_intercept_errors on;
        }
    }

    server {
        server_name bbb.com;

        location / {
            resolver 8.8.8.8;
            proxy_pass http://tenantname.myappid.appspot.com/$request_uri;
            proxy_set_header Host tenantname.myappid.appspot.com;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header NexHost $scheme://$host;
            proxy_redirect http://tenantname.myappid.appspot.com/ /;
            proxy_intercept_errors on;
        }
    }

    server {
        server_name www.ccc.com;

        location / {
            resolver 8.8.8.8;
            proxy_pass http://tenantname.myappid.appspot.com/$request_uri;
            proxy_set_header Host tenantname.myappid.appspot.com;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header NexHost $scheme://$host;
            proxy_redirect http://tenantname.myappid.appspot.com/ /;
            proxy_intercept_errors on;
        }
    }

    server {
        server_name ccc.com;

        location / {
            resolver 8.8.8.8;
            proxy_pass http://tenantname.myappid.appspot.com/$request_uri;
            proxy_set_header Host tenantname.myappid.appspot.com;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header NexHost $scheme://$host;
            proxy_redirect http://tenantname.myappid.appspot.com/ /;
            proxy_intercept_errors on;
        }
    }

    server {
        server_name ~^(?.+)\.maindomain\.com$;

        location / {
            resolver 8.8.8.8;
            proxy_pass http://$sub.myappid.appspot.com/$request_uri;
            proxy_set_header Host $sub.myappid.appspot.com;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header NexHost $scheme://$host;
            proxy_redirect http://$sub.myappid.appspot.com/ /;
            proxy_intercept_errors on;
        }
    }

    server {
        listen 80 default_server;
        server_name _;
        location / {
            root /etc/nginx/html;
        }
    }
}

1voto

Jessie Kirk Points 21

J'ai donc résolu ce problème en redirigeant depuis nginx plutôt que depuis le backend.
Bien que le problème soit maintenant résolu, je n'ai toujours pas compris pourquoi cette boucle de redirection se produisait en premier lieu.

tout indice serait utile.

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