我有幾個應用程序運行在Nginx反向代理的後面,其中一個是使用Express.js的節點服務器。我使用這個Nginx的配置進行代理domain.com/demo/app/<path>
到localhost:7003/<path>
:Nginx反向代理重寫Node.js
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;
}
...
}
}
這個偉大的工程和app
就好像是在/
紮根接收請求。問題是app
處理它自己的靜態文件,並可能請求路由,如css/app.css
或images/image.jpg
。但是由於反向代理,這些實際上分別存在於/demo/app/css/app.css
和/demo/app/images/image.jpg
。
我已經解決了這個問題,讓Nginx向Node傳遞一個自定義標題,指明根節點,Node節點服務器向所有後續請求的URL預先指定。但是現在我的代碼充斥着這些根路徑字符串。例如,我的部分後端模板:
link(rel='stylesheet', href="#{basePath}/css/base.css")
link(rel='stylesheet', href="#{basePath}/css/skeleton.css")
link(rel='stylesheet', href="#{basePath}/css/layout.css")
什麼是更優雅的方式來處理這個問題?沒有辦法讓Nginx識別來自上游服務器的請求,並自動將它們轉發給該服務器?
你如何處理AJAX請求?我不想在JavaScript中用'/ demo/app'預先加入AJAX URL –
通過上面的配置,所有請求(除/ img/...和/ js/...之外)都會被代理node.js假設它監聽端口3000.'''location /''匹配所有未被前一個location指令匹配的請求。 – esp
如果你需要讓你的應用程序處理請求,就好像他們來到'/'你仍然可以按照你的方式重寫請求...我寧願在應用程序內部有這種路由,但這是我個人的偏好...我我不確定自己能夠正確理解你想實現的目標,但是在鏈接中不包含{basepath}的唯一方法是按照我的方式重寫請求。它也允許不在節點中處理靜態文件,但如果你願意,你仍然可以代理它們... – esp