一、Location
nginx每个location都是一个匹配目录,nginx的策略是:访问请求来时,会对访问地址进行解析,从上到下逐个匹配,匹配上就执行对应location大括号中的策略,并根据策略对请求作出相应。
依访问地址:http://www.wandouduoduo.com/wddd/index.html
为例,nginx配置如下:
location /wddd/ {
proxy_connect_timeout 18000; ##修改成半个小时
proxy_send_timeout 18000;
proxy_read_timeout 18000;
proxy_pass http://127.0.0.1:8080;
}
那访问时就会匹配这个location,从而把请求代理转发到本机的8080端口的Tomcat服务中,Tomcat响应后,信息原路返回。
1.1 location没有’/’
1.2 location有’/’
举例: 配置 location /wandou 可以匹配 /wandoudouduo 请求,也可以匹配 /wandou*/duoduo
等等,只要以 wandou 开头的目录都可以匹配到。而 location /wandou/ 必须精确匹配 /wandou/ 这个目录的请求,
不能匹配 /wandouduoduo/ 或 /wandou*/duoduo 等请求。
二、URL自动加’/’
有时候访问的地址要求后面以 / 结尾,如果用户忘记输入 /,Nginx 就会自动加上 /。
通过一个例子来演示问题:
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html;
}
}
要想访问上述资源,很简单,只需要通过 http://192.168.200.133 直接就能访问,地址后面不需要加 /,但是如果将上述的配置修改为如下内容:
server {
listen 80;
server_name localhost;
location /frx {
root html;
index index.html;
}
}
这个时候,要想访问上述资源,按照上述的访问方式,我们可以通过 http://192.168.200.133/frx/ 来访问,但是如果地址后面不加斜杠,如 http://192.168.200.133/frx,页面就会出问题。如果不加斜杠,Nginx 服务器内部会自动做一个 301 的重定向,重定向的地址会有一个指令叫 server_name_in_redirect 来决定重定向的地址:
所以就拿刚才的地址来说,访问 http://192.168.200.133/frx 如果不加斜杠,那么按照上述规则:
- 如果指令 server_name_in_redirect 为 on,则 301 重定向地址变为 http://localhost/frx/,IP 发生改变,地址出现了问题
- 如果指令 server_name_in_redirect 为 off,则 301 重定向地址变为 http://192.168.200.133/frx/。这个符合我们的期望
注意 server_name_in_redirect 指令在 Nginx 的 0.8.48 版本之前默认都是 on,之后改成了 off,所以现在我们这个版本不需要考虑这个问题,但是如果是 0.8.48 以前的版本并且 server_name_in_redirect 设置为 on,我们如何通过 Rewrite 来解决这个问题?
解决方案
我们可以使用 Rewrite 功能为末尾没有斜杠的 URL 自动添加一个斜杠
server {
listen 80;
server_name localhost;
server_name_in_redirect on;
location /frx {
if (-d $request_filename){ # 如果请求的资源目录存在
rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent; # $2 获取第二个括号的值:/
}
}
}
三、proxy_pass
这里将发送 http://192.168.199.27/frx/xu 请求。
3.1 不增加目录
案例 | localtion | proxy_pass | 匹配 |
---|---|---|---|
1 | /frx | http://192.168.199.27 | /frx/xu |
2 | /frx/ | http://192.168.199.27 | /frx/xu |
3 | /frx | http://192.168.199.27/ | //xu |
4 | /frx/ | http://192.168.199.27/ | /xu |
若proxy_pass 后加’/’,代表去除掉请求和 location 的匹配的字符串
不加 ’ / ’ 则追加全部请求到地址后面。
3.2 增加目录
案例 | localtion | proxy_pass | 匹配 |
---|---|---|---|
1 | /frx | http://192.168.199.27/bing | /bing/xu |
2 | /frx/ | http://192.168.199.27/bing | /bingxu |
3 | /frx | http://192.168.199.27/bing/ | /bing//xu |
4 | /frx/ | http://192.168.199.27/bing/ | /bing/xu |
简而言之,就是如果proxy_pass后面有目录,有没有’/’,Nginx都会将匹配 location 的内容从请求路径中剔除,然后将请求路径剩余的字符串拼接到 proxy_pass 后生成新的请求路径。
举例:proxy_pass 的 ip:port 后接了字符串,因此将 location 的 /frx/ 从原请求路径 /frx/xu
中剔除,变为 xu,然后将 xu 拼接到 http://192.168.1.48/bing 后生成了新请求,因此其他地址收到的请求就是
/bingxu。
四、root和alias
这两个指令都可以来指定访问资源的路径,那么这两者之间的区别是什么?
举例说明
location /images {
root /usr/local/nginx/html;
}
访问图片的路径为:http://192.168.91.200/images/mv.png
如果是root,则请求为/usr/local/nginx/html/images/mv.png
location /images {
alias /usr/local/nginx/html;
}
如果是alias,再次访问上述地址,页面会出现 404 的错误,查看错误日志会发现是因为地址不对,所以验证了:
/usr/local/nginx/html/images/mv.png
/usr/local/nginx/html/mv.png
需要在 alias 后面路径改为:
location /images {
alias /usr/local/nginx/html/images;
}
如果 location 路径是以 / 结尾,则 alias 也必须是以 / 结尾,root 没有要求。
将上述配置修改为:
location /images/ {
alias /usr/local/nginx/html/images;
}
访问就会出问题,查看错误日志还是路径不对,所以需要把 alias 后面加上 /
location /images/ {
alias /usr/local/nginx/html/images/;
}
小结:
五、实例
location /api {
proxy_pass http://127.0.0.1:8888;
}
实际访问地址为127.0.0.1:8888/api/test
location /api/ {
proxy_pass http://127.0.0.1:8888;
}
实际访问地址为127.0.0.1:8888/api/test
- location和proxy_pass都加
location /api/ {
proxy_pass http://127.0.0.1:8888/;
}
实际访问地址为127.0.0.1:8888/test
- location不加proxy_pass加
location /api {
proxy_pass http://127.0.0.1:8888/;
}
实际访问地址为127.0.0.1:8888//test
总结:只要是proxy_pass 端口后方加了斜杠的那么 location都会被替换不会加到实际访问路径中,包括( proxy_pass
http://127.0.0.1:8888/xxx,其实就是有目录的情况)也算。
原文地址:https://blog.csdn.net/hansome_hong/article/details/131578675
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_13443.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!