对于我正在做的 node.js 项目,我有一棵像这样的树。
├── public
│ ├── components
│ ├── css
│ └── img
├── routes
└── views
本质上,我将根设置为public
。我希望所有发往
/components/
/css/
/img/
检查磁盘上是否存在相应的目标。但是,我不希望对其他目录的请求甚至运行 IO 操作,
/foo/asdf
/bar
/baz/index.html
这些都不应该导致磁盘被触碰。
我有一个 stansa,它对 node.js 进行代理,
location @proxy {
internal;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://localhost:3030;
proxy_redirect off;
}
我只是想知道如何安排。如果try_files
只接受一个参数,我的问题就很容易解决,但它总是需要一个文件。
location /components/ { try_files $uri @proxy }
location /css/ { try_files $uri @proxy }
location /img/ { try_files $uri @proxy }
然而,我找不到任何东西可以给我,
location / { try_files @proxy }
我怎样才能得到我想要的效果?
答案1
不要犹豫重复某些配置部分。这是 nginx 使配置变得简单和明显的方式。
server {
listen 80;
server_name example.com
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-NginX-Proxy true;
proxy_redirect off;
root /path/to/public;
location /components/ { try_files $uri @proxy; }
location /css/ { try_files $uri @proxy; }
location /img/ { try_files $uri @proxy; }
location / {
proxy_pass http://localhost:3030;
}
location @proxy {
proxy_pass http://localhost:3030;
}
}
但将静态和动态内容分开会更好:
server {
listen 80;
server_name example.com
root /path/to/public;
location /components/static/ { }
location /css/ { }
location /img/ { }
location / {
proxy_pass http://localhost:3030;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-NginX-Proxy true;
proxy_redirect off;
}
}
答案2
我不能 100% 确定这是正确的,但这似乎有效
location /components/ { try_files $uri / }
location /css/ { try_files $uri / }
location /img/ { try_files $uri / }
location @proxy {
internal;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://localhost:3030;
proxy_redirect off;
}