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;
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.
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;