nginx中斜杠(‘/‘)的具体使用

 更新时间:2023年10月17日 09:39:26   作者:皮卡丘的情绪  
在Nginx配置的过程中,斜杠(/)经常使用到,它们不仅可以区分不同的路径,还有其他的作用,本文就详细的介绍了nginx中斜杠(‘/‘)的具体使用,感兴趣的可以了解一下,感兴趣的可以了解一下

一、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 来决定重定向的地址:

  • 如果该指令为 on重定向的地址为:http://server_name/目录名/
  • 如果该指令为 off重定向的地址为:http://原URL中的域名/目录名/

所以就拿刚才的地址来说,访问 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 获取第二个括号的值:/
		}
	}
}

$1 是第一个括号的值,$2 是第二个括号的值。

三、proxy_pass

这里将发送 http://192.168.199.27/frx/xu 请求。

3.1 不增加目录

案例localtionproxy_pass匹配
1/frxhttp://192.168.199.27/frx/xu
2/frx/http://192.168.199.27/frx/xu
3/frxhttp://192.168.199.27///xu
4/frx/http://192.168.199.27//xu

若proxy_pass 后加’/',代表去除掉请求和 location 的匹配的字符串
不加 ’ / ’ 则追加全部请求到地址后面。

3.2 增加目录

案例localtionproxy_pass匹配
1/frxhttp://192.168.199.27/bing/bing/xu
2/frx/http://192.168.199.27/bing/bingxu
3/frxhttp://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

这两个指令都可以来指定访问资源的路径,那么这两者之间的区别是什么?举例说明

  • /usr/local/nginx/html目录下创建一个 images 目录,并在目录下放入一张图片 mv.png 图片。然后进入配置文件,添加如下内容:
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 的错误,查看错误日志会发现是因为地址不对,所以验证了:

  • root 的处理结果是:root 路径 + location 路径,location 路径包括匹配后面的请求,即包括 /mv.png

/usr/local/nginx/html/images/mv.png

  • alias 的处理结果是:使用 alias 路径替换 location 路径

/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/;
}

小结:

  • root 的处理结果是: root 路径 + location 路径
  • alias 的处理结果是:使用 alias 路径替换 location 路径
  • alias 是一个目录别名的定义,root 则是最上层目录的含义
  • 如果 location 路径是以 / 结尾,则 alias 也必须是以 / 结尾,root 没有要求
    • alias 不支持 location 的 =

五、实例

通过nginx访问 127.0.0.1/api/test

  • location和proxy_pass都不加’/’
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/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,其实就是有目录的情况)也算。

到此这篇关于nginx中斜杠(‘/‘)的具体使用的文章就介绍到这了,更多相关nginx 斜杠内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Nginx Tomcat负载均衡动静分离原理解析

    Nginx Tomcat负载均衡动静分离原理解析

    这篇文章主要为大家介绍了Nginx Tomcat负载均衡动静分离原理解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • Django+Nginx+uwsgi服务器部署

    Django+Nginx+uwsgi服务器部署

    这篇文章介绍了Django+Nginx+uwsgi服务器部署的方法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • nginx如何开启Gzip压缩

    nginx如何开启Gzip压缩

    Gzip压缩能显著减小网站静态资源如css、js、html的体积,大幅提升加载速度,它通过服务器端压缩,浏览器端解压,适用于大多数现代浏览器,但应避免对已压缩的图片或大文件进行Gzip压缩,以免无效增加CPU负担,配置Gzip压缩需在nginx的http块内设置并重启nginx
    2024-09-09
  • Nginx中部署Angular项目遇到的坑巨坑

    Nginx中部署Angular项目遇到的坑巨坑

    这篇文章主要介绍了Nginx中部署Angular项目遇到的坑巨坑,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • nginx lua集成kafka的实现方法

    nginx lua集成kafka的实现方法

    这篇文章主要介绍了nginx lua集成kafka的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • Nginx+Tomcat负载均衡及动静分离群集的实现

    Nginx+Tomcat负载均衡及动静分离群集的实现

    本文主要介绍了Nginx+Tomcat负载均衡及动静分离群集的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • Nginx解决vue项目服务器部署及跨域访问后端详解

    Nginx解决vue项目服务器部署及跨域访问后端详解

    跨域问题在前后端分离项目很常见,至于为什么会跨域,同源策略,百度各种博客都很详细,这里不再介绍,这篇文章主要给大家介绍了关于Nginx解决vue项目服务器部署及跨域访问后端的相关资料,需要的朋友可以参考下
    2022-11-11
  • Nginx HTTPS实现原理及配置实践

    Nginx HTTPS实现原理及配置实践

    本文主要介绍了Nginx HTTPS实现原理及配置实践,详细的介绍了HTTPS原理,实现及其HTTPS单台配置实践,集群配置、优化等,具有一定的参考价值,感兴趣的可以了解一下
    2023-09-09
  • 利用nginx如何匹配多个条件

    利用nginx如何匹配多个条件

    这篇文章主要给大家介绍了利用nginx如何匹配多个条件的相关资料,文中通过示例代码介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
    2017-06-06
  • Nginx离线安装的保姆级教程

    Nginx离线安装的保姆级教程

    为了确保gcc-c++和Nginx的正确安装,建议使用yum工具在线下载rpm包,避免手动下载安装时出现依赖缺失的问题,本文就来介绍一下如何离线安装,感兴趣的可以了解一下
    2024-09-09

最新评论