Modifier $request_uri dans Nginx

J'ai plusieurs applications en cours d'exécution sur le Nginx serveur:

http://example.com/app1/ctrl/view
http://example.com/app2/ctrl/view
...

Je voudrais assigner ces applications DNS comme ceci:

http://app1.example.com
http://app2.example.com
...

Pour que j'ai essayé de serveur suivantes bloc:

server {
        listen 80;
        server_name app1.example.com;

        location /{
            proxy_pass http://example.com/app1/$request_uri;
        }
}

Si un utilisateur n'est pas connecté, mon application serait de rediriger vers URI:

app1/ctrl/user/login?_next=/app/ctrl/view

Essentiellement $request_uri devient (Note doublé app1 exemple):

app1/app1/ctrl/user/login?_next=/app/ctrl/view

Est-il un moyen pratique pour modifier $request_uri ou une meilleure méthode pour contourner ce problème?

EDIT1

Il semble que j'ai résolu mon problème avec le serveur suivants bloc:

server {
        listen 80;
        server_name app1.example.com;

        location /{

            set $new_request_uri $request_uri;

            if ($request_uri ~ ^/app1/(.+)$) {
                set $new_request_uri $1;
            }

            proxy_pass http://example.com/app1/$new_request_uri;
        }
}

Si quelqu'un connait le mieux (ou le bon "Nginx") pour ce faire, s'il vous plaît n'hésitez pas à poster une réponse.

EDIT2

Sur la base des commentaires que j'ai aussi essayé le suivant:

server {
        listen 80;
        server_name app1.example.com;

        location /{
            proxy_pass http://example.com/app1/;
            proxy_redirect /app1//;
        }

        location ~ ^/app1/(.+)$ {
            return 301 http://$server_name/$1;
        }
}

Celui-ci semble le mieux sur l'écran, car il élimine la app1 exemple dans le $request_uri partie complètement, mais vous devez avoir deux location blocs.

EDIT3

Le moyen le plus efficace pour résoudre mon problème, apparemment, comme montré sur cette config:

server {
        listen 80;
        server_name app1.example.com;

        location /{
            proxy_pass http://example.com/app1/;
            proxy_redirect /app1//;
        }

        location /app1/{
            rewrite ^/app1(.+) $1 permanent;
        }
}

Cela est dû au fait, que Nginx essaie toujours de faire correspondre le plus long prefix d'abord et ensuite (si ^~ modificateur n'est pas présent) commence de manière séquentielle traitement regexes jusqu'à la première regex match est trouvé. Essentiellement, cela signifie que tous les regexes sont traitées à chaque requête, peu importe si l'un de ces trouver un match, donc c'est mieux d'avoir regexes à l'intérieur de location directives.

  • Très agréable de voir les mises à jour et toutes les solutions. Un moyen de contourner nginx de toujours trouver la plupart des endroit précis à l'aide de correspondances exactes avec =.
InformationsquelleAutor NarūnasK | 2015-09-02