Nginx 学习(一)proxy_pass 反代路由的替换和 root 与 alias 的区别

因为一开始没整理归类文件的习惯,把手头的主力开发机弄得很乱,索性就备份了些重要文件重装了电脑,然后就把服务器的 Nginx 配置文件全丢了……剩下服务器上一堆没注释的配置连自己都看晕了,就重新学下吧。


Nginx 反代路由的替换在同一服务器部署多项目是还是很常用的,比方说我有一个将 https://ceshiku.cn/tiny-server-proxy/ 反代到本地的 57191 端口的需求,但是又不想影响到主路由和其他项目地址例如 https://ceshiku.cn/test/ 的解析。
我肯定不能这么写:

location ^~ /tiny-server-proxy {
    proxy_pass http://localhost:57191;
}

为什么呢,如果我这么写的话,那当我访问 https://ceshiku.cn/tiny-server-proxy/status 的时候,虽然能被代理到指定端口上运行的项目,但是实际上项目收到的请求路由是这样的:
错误路由
很明显多出来的 /tiny-server-proxy/ 其实是我不需要的,那我改一下:

location ^~ /tiny-server-proxy/ {
    proxy_pass http://localhost:57191;
}

结果收到的路由呢,如下:
错误路由
依旧是多了 /tiny-server-proxy/ 这个路径,可见在路由匹配上下功夫是没有用的,只能在 proxy_pass 后反代的端口上做更改:

location ^~ /tiny-server-proxy/ {
    proxy_pass http://localhost:57191/;
}

再试一下,果然可以了:
正常路由
那么 Nginx 反代到端口项目时路由部分路径替换的问题就解决了。


那么碰到动静分离的项目,想要访问静态资源时替换路径有该怎么操作呢,这个时间就要搬出除了 root 之外 Nginx 另一个资源映射语法了:alias

location ^~ /t/ {
    root /www/root/html/;
}

location ^~ /t/ {
    alias /www/root/html/;
}

当路由和文件夹配置完全一样的情况下,当请求链接是 /t/a.html 的情况下,两个配置分别会:
root 的配置会返回 /www/root/html/t/a.html 的文件,alias 的配置会返回 /www/root/html/a.html 的文件,alias 所起的作用就和刚刚往反代端口后加的斜杠类似,做到因为把 location 后面配置的路径完全舍弃。
但是用的时候还需要注意:alias 只能位于 location 块中(root 可以不放在 location 中)。