Comment puis-je faire en sorte qu’un proxy nginx arrête de redirect vers root?

J’ai une application de nœud s’exécutant en tant que proxy sur nginx dans un sous-répertoire. J’ai des problèmes avec les redirections qui pointent vers une autre partie de l’application elle-même. Ils redirigent toujours vers la racine au lieu du sous-répertoire du proxy.

Exemple:

Si le proxy de mon application est à https://example.com/myApp/ et qu’il redirige vers /admin/ je souhaite que la page redirige vers https://example.com/myApp/admin/ non https://example.com/admin/ .


Voici la section pertinente de ma configuration:

  location /myApp { rewrite /myApp(.*) $1 break; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; proxy_set_header X-NginX-Proxy true; proxy_pass http://localhost:3030; proxy_redirect http://localhost:3030/ /myApp/; } 

J’ai également essayé de définir proxy_redirect sur (^|^http://localhost:3030)/ /myApp/;


Voici le fichier de configuration complet pour ce domaine:

 upstream php-handler { #server 127.0.0.1:9000; server unix:/var/run/php5-fpm.sock; } ## HTTP server { listen 80 default_server; listen [::]:80 default_server ipv6only=on; server_name example.com www.example.com; return 301 https://$server_name$request_uri; } ## HTTPS server { listen 443 ssl; server_name example.com; ssl_certificatee /etc/ssl/www.example.com.crt; ssl_certificatee_key /etc/ssl/www.example.com.key; add_header Ssortingct-Transport-Security "max-age=15768000; includeSubDomains; preload;"; add_header X-Content-Type-Options nosniff; add_header X-Frame-Options "SAMEORIGIN"; add_header X-XSS-Protection "1; mode=block"; root /var/www/example.com/; index index.html index.php; client_max_body_size 500M; fastcgi_buffers 64 4k; gzip on; # Website location / { try_files $uri $uri/ =404; location ~ \.php$ { fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; include fastcgi_params; } } # My App location /myApp { rewrite /myApp(.*) $1 break; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; proxy_set_header X-NginX-Proxy true; proxy_pass http://localhost:3030; proxy_redirect http://localhost:3030/ /myApp/; } 

Bon, je l’ai compris moi-même.

tl; dr:

Cela a fonctionné:

 proxy_redirect ~(^http://localhost:3030|^)/(.*)$ /myApp/$2; 

Première option:

 proxy_redirect / /myApp/; 

Je suppose que cela fonctionne car l’application redirige vers /admin/ pas http://localhost:3030/admin/ . Ceci, cependant, ne fournit pas la flexibilité que je recherche.


Deuxième option:

Utilisez RegExp

J’ai donc fait quelques erreurs à l’origine lorsque j’ai essayé d’utiliser regex comme ceci:

 proxy_redirect (^|^http://localhost:3030)/ /myApp/; 

Tout d’abord , si vous utilisez regex, vous devez le démarrer avec ~ pour la casse ou ~* pour la casse.

Deuxièmement , lorsque vous utilisez regex, il remplace apparemment le chemin complet au lieu de la partie correspondante. Par exemple, si vous définissez un proxy_redirect comme ceci:

 proxy_redirect ~/(a|b)/ /myApp/; 

Si vous redirigez ensuite vers /a/some-subdirectory/ la réécriture entraînera /myApp/ not /myApp/some-subdirectory/ . Pour que cela fonctionne, vous devez capturer la fin du chemin et l’insérer à la fin de la réécriture comme ceci:

 proxy_rewrite ~/(a|b)/(.*)$ /myApp/$2; 

Remarque : je ne trouve aucune information sur ce comportement dans les documents. Je me base uniquement sur les résultats de mes propres essais et erreurs.


Donc, mon proxy_redirect final ressemble à ceci:

 proxy_redirect ~(^http://localhost:3030|^)/(.*)$ /myApp/$2; 

De mon sharepoint vue, vous devriez essayer la directive listen dans le bloc serveur, définissez-la comme source par défaut (source: http://nginx.org/en/docs/http/request_processing.html ):

 listen 80 default_server; 

La déclaration suivante est conçue comme un nom de serveur non valide (source: http://nginx.org/en/docs/http/server_names.html ) (afin qu’elle ne recoupe jamais aucun de vos domaines valides):

 Server_name _; 

Pour résoudre ce problème, assurez-vous d’avoir un bloc de serveur avec listen (port) et nom_serveur (hôte virtuel) – celui-ci sera déclenché au départ de «plus précis à moins précis» lorsque les noms d’hôtes virtuels correspondent à nginx :

 Listen 80 Server_name your-domain-name.com;