Comment gérer réponse de redirection correctement lors de l'utilisation de Nginx comme serveur proxy, django comme backend

J'ai une application Django et récemment, j'ai besoin de lancer une version bêta. Je veux garder l'actuelle application en cours d'exécution intacte, et de rediriger toutes les demandes commence par "/beta" pour l'application en version bêta, avec l'aide de Nginx. Voici ma conf

    location / {
    proxy_pass_header Server;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Scheme $scheme;
    proxy_connect_timeout 10;
    proxy_read_timeout 360;
    proxy_pass http://localhost:8000/;
}

location /beta/ {
    rewrite ^/beta/(.*)$ /$1 break;
    proxy_pass_header Server;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Scheme $scheme;
    proxy_connect_timeout 10;
    proxy_read_timeout 360;
    proxy_pass http://localhost:8001/;
}

Cela fonctionne, mais il y a un problème, lorsque l'application renvoie un 301 de la réponse, surtout lorsque l'utilisateur doit se connecter pour accéder à certaines ressources, l'URL devient l'ancien.

Par exemple, si /events est login requis.

http://example.com/beta/events -> http://example.com/login?next=/events/

Comment puis-je résoudre ce problème sans changer le code de l'application? (Nginx solution?)

si vous n'êtes pas le gérer dans le django backend/middleware au lieu de nginx ?
à l'aide de sous-domaine beta.example.com est une meilleure solution pour moi
ai-je bien compris que vous êtes à l'aide de Django reinhardt, intégré dans le serveur de développement comme le backend pour le proxy? vous ne devriez pas le faire. Si vous avez été en utilisant, par exemple, uwsgi, votre problème aurait une jolie solution simple (et votre application serait de travailler beaucoup plus vite)
Depuis django n'est pas au courant de votre nginx configuration, il ne peut pas créer des liens qui sont conscients de /beta/. La seule différence entre une demande de /foo that was redirected to a request to the base app /foo` est le référent. Vous aurez à renifler le référent et la faire précéder de /beta/ si vous trouvez l'utilisateur originaire de /beta/ ou quelque chose
Oui, je sais, mais je ne veux pas configurer un sous-domaine à des fins de test. En tout cas merci!

OriginalL'auteur xiaowl | 2013-05-21