Nginx踩坑记录之反向代理、URL重写、URL路径匹配

说明:这是踩坑记录不是教程!!!

反向代理:

proxy_pass 后跟的服务器URL值是否以 / 结尾的区别:

若 Nginx 收到请求为 https://ngxin_server_name/hello/world
而 Nginx 代理的路径为 /hello/(即在 location /hello/ 内设置代理)
则不以 / 结尾的被代理服务器收到的请求路径是 /hello/world
以 / 结尾的被代理服务器收到的请求路径是 /world
如果是为了在同一个域名下以不同路径分配不同的APP应选择后者以 / 结尾

Nginx 的代理HTTP版本默认为1.0,若要设置为1.1则需添加

proxy_http_version 1.1;
proxy_set_header Connection "";

URL 路径匹配:

这里没怎么踩坑,因为 Nginx 默认如果是普通路径匹配(无正则)优先匹配路径长的并不会继续往下匹配。(当然可以设置往下匹配)

若同时设置了 /app/hello 和 /app 两个路径,当请求URL应匹配到 /app 时,
会优先匹配更长的 /app/hello 并且不会继续往下匹配 /app。

另一个需要注意的地方是路径是否以 / 结尾,若以 / 结尾则路径可被目标服务器继承,反之则不可。

若设置的是 location /app {xxx} 而请求的路径为 /app/hello/world
尽管目标服务器的app设置了匹配 /hello/world 但只能匹配到 /hello
若设置的是 location /app/ {xxx} 而请求路劲为 /app/hello/world
目标服务器的app可以匹配到/*/*/*/...所有的路径 (/ 也看作是以 / 结尾)

URL 重写:

我用来域名重定向、强制HTTPS

if ($host != 'lkxed.cn' ) {
    rewrite ^/(.*)$ https://lkxed.cn/$1 permanent;
}
值得解释的是
其中地址末尾的 $1 是前面 ^/(.*)$ 匹配到的第一个分组
也就是域名后跟的完整路径字符串
当我的重写规则如上方那样配置了之后
若请求路径为 http://www.lkxed.cn/app/hello/world
则它会被重定向到 https://lkxed.cn/app/hello/world
所以一般都会在目标地址末尾加上 $1 不使路径丢失

猜你喜欢

转载自blog.csdn.net/randomparty/article/details/80961189