Mam kilka aplikacji działających za odwrotnym proxy Nginx, z których jednym jest serwer Node z Express.js. Ja buforowania domain.com/demo/app/<path>
do localhost:7003/<path>
użyciu tego Nginx config:Nginx Reverse Proxying to Node.js z Rewrite
http {
...
server {
listen 80;
server_name domain.com;
...
location /demo/app {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Scheme $scheme;
rewrite ^/demo/app/?(.*) /$1 break;
proxy_pass http://localhost:7003;
}
...
}
}
Działa to doskonale i app
odbiera żądania, jakby to było zakorzenione w /
. Problem polega na tym, że app
obsługuje własne pliki statyczne i może wysyłać żądania dotyczące tras, takich jak css/app.css
lub images/image.jpg
. Ale z powodu odwrotnego proxy, istnieją one odpowiednio w /demo/app/css/app.css
i /demo/app/images/image.jpg
.
Rozwiązałem to, pobierając Nginx, aby przekazał do węzła niestandardowy nagłówek wskazujący ścieżkę główną, którą serwer węzła przedkłada pod adresy URL wszystkich kolejnych żądań. Ale teraz mój kod jest zaśmiecony tymi ciągami ścieżki głównej. Na przykład część moich szablonów back-end:
link(rel='stylesheet', href="#{basePath}/css/base.css")
link(rel='stylesheet', href="#{basePath}/css/skeleton.css")
link(rel='stylesheet', href="#{basePath}/css/layout.css")
Co jest bardziej eleganckiego sposobu poradzenia sobie z tym? Czy nie ma sposobu, aby Nginx rozpoznał żądania przychodzące z serwera nadrzędnego i automatycznie przekazał je na ten serwer?
Jak radzisz sobie z żądaniami AJAX? Nie chcę wstawiać adresów URL AJAX w kodzie JavaScript z '/ demo/app' –
W konfiguracji powyżej wszystkie żądania (inne niż do/img/... i/js/...) będą node.js zakładając, że nasłuchuje na porcie 3000. '' 'location /' '' dopasowuje wszystkie żądania, które nie zostały dopasowane przez poprzednią dyrektywę lokalizacji. – esp
Jeśli chcesz, aby Twoje żądania dotyczące procesu aplikacji wyglądały tak, jakby przychodziły do '/' nadal możesz przepisać żądania w taki sposób, w jaki zrobiłeś to ... Wolałbym mieć to routing wewnątrz aplikacji, ale to jest moja osobista preferencja ... nie jestem pewien, czy poprawnie zrozumiałem, co chcesz osiągnąć, ale jedynym sposobem na to, aby nie włączać {basepath} w linkach, jest przepisywanie żądań w taki sposób, jak ja. Pozwala również nie przetwarzać plików statycznych w węźle, ale jeśli chcesz, możesz nadal je również proxy ... – esp