Dans Nginx, nous avons essayé de rediriger une URL de la manière suivante:
http://example.com/some/path -> http://192.168.1.24
où l'utilisateur voit toujours l'URL d'origine dans son navigateur. Une fois que l'utilisateur est redirigé, disons qu'il clique sur le lien vers /section/index.html
, nous voudrions que cela fasse une demande qui mène à la redirection
http://example.com/some/path/section/index.html -> http://192.168.1.24/section/index.html
et encore conservez l'URL d'origine.
Nos tentatives ont impliqué diverses solutions utilisant des proxies et des règles de réécriture. Le schéma ci-dessous illustre la configuration qui nous a rapprochés le plus d'une solution (notez qu'il s'agit de la configuration de serveur Web pour le example.com
serveur Web). Cependant, il y a toujours deux problèmes avec ceci:
- La réécriture n’est pas effectuée correctement car l’URL de la demande reçue par le serveur Web
http://192.168.1.24
inclut/some/path
et ne peut donc pas servir la page requise. Lorsque vous passez la souris sur un lien une fois qu'une page a été servie, il
/some/path
manque l'URLserver { listen 80; server_name www.example.com; location /some/path/ { proxy_pass http://192.168.1.24; proxy_redirect http://www.example.com/some/path http://192.168.1.24; proxy_set_header Host $host; } location / { index index.html; root /var/www/example.com/htdocs; } }
Nous recherchons une solution qui implique uniquement de modifier la configuration du serveur Web example.com
. Nous sommes en mesure de modifier la configuration sur 192.168.1.24
(également sur Nginx), mais nous souhaitons éviter cela car nous devrons répéter cette configuration pour des centaines de serveurs différents dont l'accès est contrôlé par proxy example.com
.
root
dans unlocation
bloc, vous n’obtiendrez donc aucun comportement inattendu pour les emplacements par défaut. Si vous devez modifier la valeurroot
par défaut pour chaque emplacement, vous pouvez l'utiliser.Vous devez utiliser la partie URI de la
proxy_pass
directive. En outre, vous avez mélangé les arguments d'ordre deproxy_redirect
directive et vous n'en avez probablement pas besoin du tout. Nginx a une valeur par défaut raisonnable pour cette directive.Dans ce cas, votre
location
bloc pourrait être très simple:la source
/some/path/
partie de l'URL est conservée dans la demande, ce qui n'est pas une URL valide (nous devons également réécrire l'URL pour la supprimer).Vous pouvez utiliser la configuration suivante pour obtenir un mappage transparent à 100% entre
/some/path/
le serveur frontal et/
le serveur principal.Notez que c’est la seule réponse jusqu’à présent qui prendrait également en charge de manière transparente les chemins absolus générant des
404 Not Found
erreurs, à condition que le bon en-Referer
tête HTTP soit envoyé par le navigateur. Ainsi, tous ces gifs devraient continuer à se charger sans qu'il soit nécessaire de modifier le code HTML sous-jacent. (ce qui est non seulement coûteux, mais n’est pas non plus pris en charge sans modules supplémentaires non compilés par défaut).Vous trouverez la preuve complète de concept et produit viable minimale dans le https://github.com/cnst/StackOverflow.cnst.nginx.conf référentiel.
Voici un test visant à confirmer que tous les cas extrêmes semblent fonctionner:
PS Si vous avez beaucoup de chemins différents à la carte, puis au lieu de faire une comparaison regex
$http_referer
dans un auif
seinlocation @404
, vous voudrez peut - être utiliser la base globalmap
directive à la place.Notez également que les barres obliques finales dans le
proxy_pass
, ainsi que dans lelocation
contenu, sont assez importantes selon une réponse associée .Références:
la source
Lorsque cette barre oblique est ajoutée à un jenkins mandaté par Nginx, le message d'erreur «Il semble que la configuration de votre proxy inverse soit défectueuse».
Il faut lire
la source