正文
Nginx在日常工作中使用很频繁,成为WEB发布中重要的中间件,讲一讲我在Nginx使用中的一些问题。
一、alias和root
使用alias时里面加/,外面就要加/;里面不加外面也不能加;alias代理的是整个完整路径,包括最后的/。
location /user {
alias /opt/webapps;
try_files $uri $uri/ /index.html
index index.html index.htm;
}
#或者
location /user/ {
alias /opt/webapps/;
try_files $uri $uri/ /index.html
index index.html index.htm;
}
用root时外面有没有/,和里面有没有/无所谓;外面的路径最后会拼接在里面路径的后面。
二、proxy_pass和rewrite
proxy_pass后面加不加 / 匹配有所不同,一般整站代理最精简的proxy_pass即可跑起来。
代理不带项目名称,没有 /
server {
listen 7001;
server_name locahost;
location /proxy/ {
proxy_pass http://127.0.0.1:7000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
代理不带项目名称,但是有 /
server {
listen 7002;
server_name locahost;
location /proxy/ {
proxy_pass http://127.0.0.1:7000/;
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_pass 后面不带 /,我们自定义的路径名会当成url的一部分拼接到后端url里。
7001端口实际访问http://127.0.0.1:7000/proxy/index.html proxy_pass
后面带 /,我们的自定义的路径名就不会被视作url的一部分去拼接到后端url。
7002端口实际访问http://127.0.0.1:7000/index.html
proxy_pass带后缀斜杠,如果此处写成/proxy 那么后端接收到的路由就是//,前面会有两个斜杠,所以alais后面要加/。
如果是带 / 这种情况,location后面只能用 =、^~、/ 匹配方式,也就是精确匹配、开头匹配及通配,不能使用~正则匹配这种方式,会报错:nginx: [emerg] "proxy_pass" cannot have URI part in location given by regular expression, or inside named location, or inside "if" statement, or inside "limit_except" block in /usr/local/nginx/conf/nginx.conf:69
Nginx提供了rewrite指令,用于对地址进行重写,语法规则:
rewrite "用来匹配路径的正则" 重写后的路径 [指令];
# 去除前缀rewrite重写路由
location /proxy {
# rewrite指令重写路由:通过正则匹配取出proxy之外的部分,然后用捕获子组重设了请求URI
# 传递给后端的URI是已经被重设过的
rewrite ^/proxy/(.*)$ /$1 break;
proxy_pass http://127.0.0.1:7000;
# 因为URI经过rewrite指令 请求/proxy/apidate/2022实际已经被重写成了/apidate/2022
# 所以传递给后端时proxy_pass带不带后缀斜杠已经不影响,也就是说重写前提下述这种带后缀斜杠的写法也是没有问题的,但是并不推荐这样写
# "^/proxy/(.*)$":匹配路径的正则表达式,用了分组语法,把/proxy/以后的所有部分当做1组
# /$1:重写的目标路径,这里用$1引用前面正则表达式匹配到的分组(组编号从1开始),即/proxy/后面的所有。这样新的路径就是除去/proxy/以外的所有,就达到了去除/proxy前缀的目的
# break:重写路径结束后,不再重新匹配路径。
# 这里有一个调试技巧,通过return 204仅返回头部,以及添加自定义header头来返回需要调试的内容进行debug
# 利用add_header指令将当前的参数输出到header,然后返回204就可以看到$uri、$query_string当前的值
location /cc {
add_header 'X-Request-Uri' $uri;
add_header 'X-Request-Uri' $request_uri;
add_header 'X-Request-Query' $query_string;
return 204;
}
三、try_files
try_files $uri $uri/ /index.html
try_files,尝试访问对应的资源,在第一个资源访问不到时,访问第二个资源,以次向后。
$uri 表示一个文件,$uri/ 表示一个目录。
所以以上配置的规则为当 $uri 和 $uri/ 均不是对应资源时,则返回 /index.html页面。
文章名称:《Nginx配置总结》
文章链接: https://www.sgtms.com/shorthand/87.html
本站资源仅供个人学习交流,转载或者引用本文内容请注明来源及作者,不允许用于商业用途。
网友评论抢沙发