正文
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
本站资源仅供个人学习交流,转载或者引用本文内容请注明来源及作者,不允许用于商业用途。
网友评论抢沙发