首页
博客
研修院
VIP
APP
问答
下载
社区
推荐频道
活动
招聘
专题
打开CSDN APP
Copyright © 1999-2020, CSDN.NET, All Rights Reserved
打开APP
Young丶
关注
Nginx 配置中一个不起眼字符 “/“ 的巨大作用 原创
2021-10-20 15:22:53
Young丶
码龄9年
关注
图片
Nginx作为一个轻量级的,高性能的web服务软件,因其占有内存少,并发能力强的特点,而广受欢迎和使用。国内很多大型互联网公司也对Nginx很是青睐。像BAT(百度,阿里和腾讯),TMD(头条,美团和滴滴)等等。使用过Nginx的同学都知道,你只需要按需求准确的更改好配置启动,那么就可以优雅的访问它了。所以说Nginx对配置文件的很是看中呢,这就要求我们更改配置文件时一定要再三确认,要不然可能因为疏忽而引发惨案呢?真实案例,就因为在配置时,少写了一个字符“/”,就造成访问不通报错,因而接到投诉。那么是怎么引起的呢?原因就是:Nginx在配置proxy_pass代理转接时,少些“/”字符造成的。有同学就有疑问,加不加“/”,区别真的那么大吗?我们带着这个疑问,来探究下这个问题。
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
}
1
2
3
4
5
6
1
2
3
4
5
6
那访问时就会匹配这个location,从而把请求代理转发到本机的8080Tomcat服务中,Tomcat相应后,信息原路返回。总结:location如果没有“/”时,请求就可以模糊匹配以字符串开头的所有字符串,而有“/”时,只能精确匹配字符本身。
下面举个例子说明:
配置location /wandou可以匹配/wandoudouduo请求,也可以匹配/wandou*/duoduo等等,只要以wandou开头的目录都可以匹配到。而location /wandou/必须精确匹配/wandou/这个目录的请求,不能匹配/wandouduoduo/或/wandou*/duoduo等请求。
proxy_pass有无“/”的四种区别探究
访问地址都是以:http://www.wandouduoduo.com/wddd/index.html 为例。请求都匹配目录/wddd/
第一种:加"/"
location /wddd/ {
proxy_pass http://127.0.0.1:8080/
}
1
2
3
1
2
3
测试结果,请求被代理跳转到:http://127.0.0.1:8080/index.html
第二种: 不加"/"
location /wddd/ {
proxy_pass http://127.0.0.1:8080
}
1
2
3
1
2
3
测试结果,请求被代理跳转到:http://127.0.0.1:8080/wddd/index.html
第三种: 增加目录加"/"
location /wddd/ {
proxy_pass http://127.0.0.1:8080/sun/
}
1
2
3
1
2
3
测试结果,请求被代理跳转到:http://127.0.0.1:8080/sun/index.html
第四种:增加目录不加"/"
location /wddd/ {
proxy_pass http://127.0.0.1:8080/sun
}
1
2
3
1
2
3
测试结果,请求被代理跳转到:http://127.0.0.1:8080/sunindex.html
总结
location目录后加"/",只能匹配目录,不加“/”不仅可以匹配目录还对目录进行模糊匹配。而proxy_pass无论加不加“/”,代理跳转地址都直接拼接。
为了加深大家印象可以用下面的配置实验测试下:
server {
listen 80
server_name localhost
# http://localhost/wddd01/xxx ->http://localhost:8080/wddd01/xxx
location /wddd01/ {
proxy_pass http://localhost:8080
}
# http://localhost/wddd02/xxx ->http://localhost:8080/xxx
location /wddd02/ {
proxy_pass http://localhost:8080/
}
# http://localhost/wddd03/xxx ->http://localhost:8080/wddd03*/xxx
location /wddd03 {
proxy_pass http://localhost:8080
}
# http://localhost/wddd04/xxx ->http://localhost:8080//xxx,请注意这里的双斜线,好好分析一下。
location /wddd04 {
proxy_pass http://localhost:8080/
}
# http://localhost/wddd05/xxx ->http://localhost:8080/hahaxxx,请注意这里的haha和xxx之间没有斜杠,分析一下原因。
location /wddd05/ {
proxy_pass http://localhost:8080/haha
}
# http://localhost/api6/xxx ->http://localhost:8080/haha/xxx
location /wddd06/ {
proxy_pass http://localhost:8080/haha/
}
# http://localhost/wddd07/xxx ->http://localhost:8080/haha/xxx
location /wddd07 {
proxy_pass http://localhost:8080/haha
}
# http://localhost/wddd08/xxx ->http://localhost:8080/haha//xxx,请注意这里的双斜杠。
location /wddd08 {
proxy_pass http://localhost:8080/haha/
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
打开CSDN APP,看更多技术内容
【nginx省略.html后缀的配置】配置Nginx上的静态网页在访问的时没有htm...
配置Nginx上的静态网页在访问的时没有html后缀_小李白给了的博客-CSDN博客_nginx不带后缀访问 location / { # 【兼容】自动省略.html的页面【比如:zh/app.html】可以直接【zh/app】访问! if (!-e $request_filename){ rewrite ...
继续访问
nginx Linux环境使用命令整理_nginx命令linux_smileNicky的博客-CSDN博...
第一种:先使用前面介绍的ps命令查看nginx的master process进程pid,然后kill -QUIT [pid]或者kill -HUP [pid],接着重启一下 /user/nginx/nginx-1.14.0/sbin/nginx -c /user/nginx/nginx-1.14.0/conf/nginx.conf 1 第二种:直接...
继续访问
nginx配置文件中斜杠/的6种含义
nginx配置文件中斜杠/的6种含义 nginx配置proxy_pass时,/的6种含义+没有/的含义 nginx配置proxy_pass时,斜杠的6种含义,不写斜杠/的含义
最新发布 nginx去除目录最后斜杠
去除目录最后一个斜杠?目录最后加上斜杠?斜杠有力量~~
继续访问
nginx 省略index.php,nginx配置thinkphp项目(nginx下去掉index.php)_保...
error_page 404 403 500 502 503 504 /404.htmllocation = /404.html { root /} location ~ \.php$ { fastcgi_pass 127.0.0.1:9000fastcgi_index index.phpfastcgi_split_path_info ^((?U).+\.php)(/?.+)...
继续访问
nginx配置伪静态 ,省略index.php_517号刺猬的博客
Nginx URL重写(rewrite)配置及信息详解 : https://www.cnblogs.com/czlun/articles/7010604.html-e $request_filename + nginx内置变量 : https://www.cnblogs.com/infy/p/8550282.html去掉index.php: https://blog.csdn.net/...
继续访问
nginx配置 -- 让匹配路径不作为文件目录的一部分
转自: https://blog.csdn.net/u011510825/article/details/50531864nginx指定文件路径有两种方式root和alias,ot与alias主要区别在于nginx如何解释location后面的uri,这会使两者分别以不同的方式将请求映射到服务器文件上。[root]语法:root path默认值:root html配置段:http、server、l...
继续访问
nginx反向代理去除目录层级转发
项目场景: 新系统上线,由于生产环境域名有限,分配域名时添加一层路径用于F5请求拦截分发。 使用中间件: web: Nginx ---->主要用于请求转发,不做负载均衡策略。 应用:tomcat-9.0.36 --->处理业务逻辑 问题描述: nginx 发送ajax请求时无法正确通讯 设定线上访问路径为: https://dev.test.com/cpp-test-project/page/index.html 上线时实际访问路径为: https://dev.test.co.
继续访问
nginx环境下laravel框架URL省略输入index.php的配置
laravel框架在路由设置里的web.php文件新增一个路由(如下图1),如果nginx里没有做任何配置,那么在访问新增路由时。url地址需要携带index.php+新增的路由(既:http://www.laraveldev.com/index.php/goods) ...
继续访问
nginx_诺坎普第一球探的博客
nginx(发音同engine x)是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like协议下发行。nginx的特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆...
继续访问
[Nginx]目录自动添加“/”
本文为笔者学习笔记,参考《Nginx高性能Web服务器详解》 自动为请求的URL末尾添加“/” location ^~ /vote { if (-d $request_filename) { rewrite ^/(.*)([^/])$ https://$server_name/$1$2/ permanet}
继续访问
Nginx详解(一文带你搞懂Nginx)
前言 最近进入了新篇章的学习,Nginx,特写下详细笔记与大家共享。 目录前言一、Nginx是什么?二、Nginx的反向代理(扩展:正向代理)三、Nginx的负载均衡什么是负载均衡?Nginx的动静分离!四、Nginx的安装windows版本下的安装下载启动检查是否安装成功配置监听关闭NginxLinux版本下的安装总结
继续访问
Nginx常用反向代理配置规则_JunyouYH的博客
上述配置便是将my_server服务的根路径下的所有路径代理到nginx地址的/my/路径下。当nginx配置只有一个server时,http://$host:$server_port前缀可以省略。 3. 报文数据替换 使用nginx代理最牛(dan)逼(sui)的情况就是http响应报文内写...
继续访问
nginx知识点整理_istan1ey的博客
nginx知识点整理 配置解析 ngx_http_block ngx_http_core_server ngx_http_optimize_servers instance 配置解析 ngx_event_process_init:遍历connections,初始化listenfd的回调函数,添加事件监听
继续访问
Nginx 去除多斜杠 (//)
某些历史遗留问题,可能链接中有出现双斜杠或者是多斜杠现象,需要去掉多余的只保留1个斜杠。 Nginx直接再server或者是对应的位置加上下面两行配置即可 server { listen 80server_name localhostlocation / { proxy_pass http://nginx-A} //去除多斜杠的配置 merge_
继续访问
nginx中斜杠(/)详解
不知大家日常在nginx配置时,是不是会对是否加斜杠充满疑惑? 配置location、proxy_pass时,加“/”与不加“/”的区别,今天我们通过实操去验证下。 talk is cheap, show me the code!!! 通过nginx代理访问地址:http://127.0.0.1/v1/pt/apply/page location、proxy_pass都不加斜杠 location /v1 { proxy_pass http://127.0.0.1:8899} 实.
继续访问
Nginx 配置“/”的作用
location目录匹配详解 依访问地址:http://www.wandouduoduo.com/wddd/index.html为例,nginx配置如下: location /wddd/ { proxy_connect_timeout 18000##修改成半个小时 proxy_send_timeout 18000proxy_read_timeout 18000proxy_pass http://127.0.0.1:8080} 总结:location如果没有.
继续访问
nginx配置中一个不起眼字符“/“
文章目录nginx配置中一个不起眼字符"/"1.问题2.`location`3.`proxy_pass`4.总结5.案例总结 nginx配置中一个不起眼字符"/" 1.问题 [!DANGER] nginx在配置proxy_pass代理转接和location时,多加少加“/”字符会产生完全不一样的效果。 2.location [!TIP] nginx每个location都是一个匹配目录,nginx的策略是:访问请求来时,会对访问地址进行解析,从上到下逐个匹配,匹配上就执行对应location大括号中的策
继续访问
Nginx 访问子目录时,不加/出现301重定向的问题
现在手上有一个项目,分为前台(ibms)和后台(opc)两部分,使用IP和端口进行访问测试,使用http://192.168.100.10:7000时访问前台,使用http://192.168.100.10:7000/admin访问后台,nginx配置规则如下: server { listen 80server_name localhostlocation / { root /srv/app/ibms
继续访问
Nginx访问二级目录后/(反斜杠)无法访问问题的解决办法
今天,有位wnmp的用户反映,Nginx访问二级目录的时候不加/(反斜杠)无法访问,现在给出解决办法。 我用的是正则表达式自动加/(反斜杠)。 if (-d $request_filename){rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent} 转载于:https...
继续访问
Nginx目录自动加斜线详解
<br />今天配置Nginx时,我设置了一个域名:http://www.yuhongchun027.com,下面有web目录为www;现在的问题就是如果我访问http://www.yuhongchun027.com/www/就可以显示出地址,但如果我访问http://www.yuhongchun027.com/www结果却提示说找不到所需要的页面。哈哈,又开始犯老错了,nginx不会自动在请求的最后加上一个/的,原因是nginx不会自动判断请求的是一个文件还是一个目录,解决方法为:<br />在配置文
继续访问
NGINX处理//(双斜杠)问题
问题引入 最近开发反馈在服务器内读取到的url在一个特定的地方多了一个/,本来应该是http://example.domain.url/servername/appname/dosomething这样的地址,在服务器上收到的地址为http://example.domain.url/servername//appname/dosomething,影响了后续的应用处理。 在应用服务器的前一层恰好是NGINX反向代理。网络硬件截取域名,将http://servername/appname/dosomething丢
继续访问
热门推荐 nginx学习,看这一篇就够了:下载、安装。使用:正向代理、反向代理、负载均衡。常用命令和配置文件,很全
文章目录前言一、nginx简介1. 什么是 nginx 和可以做什么事情2.Nginx 作为 web 服务器3. 正向代理4. 反向代理5. 动静分离6.动静分离二、Nginx 的安装三、 Nginx 的常用命令和配置文件四、 Nginx 配置实例 1 反向代理五、 Nginx 配置实例 2 负载均衡六、 Nginx 配置实例 3 动静分离七、 Nginx 的高可用集群 前言 一、nginx简介...
继续访问
配置location、proxy_pass的坑
配置location、proxy_pass时,加“/”与不加“/”的区别,今天我们通过实操去验证下。通过nginx代理访问地址:http://127.0.0.1/v1/pt/apply/pagelocation、proxy_pass都不加斜杠1 2 3 location /v1 { proxy_pass http://127.0.0.1:8899} 实际访问代理地址:http://127.0.0.1:8899/v1/pt/apply/pagelocation加斜杠,proxy_pass不加斜杠1 2 3
继续访问
Nginx — 配置文件详细解读(一)
Nginx——配置文件详细解读(一) Nginx是一款免费、开源、性能强大且非常流行的服务器,主要有三个功能:Web Server , Reverse Proxy Server , IMAP or POP3 Proxy Server 。Nginx是为了解决互联网业内著名的 “C10K” 问题而生,且因其具有丰富的特性、极其强大的性能、配置简单、工作稳定及资源占用低等特点而闻名于世。
继续访问
通俗理解什么是Nginx
举个例子: 你写了一个项目,前后端分离,前端使用ajax来访问后端API,那么你本地运行你的项目是这么个顺序 启动后端服务 启动前端服务 但是你前端就是一写静态文件(js css html等),怎么运行呢,最直接的办法就是在浏览器打开本地文件 file:///E:/file_share/web/index.html 这样虽说能实现功能但是你的朋友想看你的界面就不能在他电脑上也这么搞, 因为他电脑上没有你的这些前端静态文件, 你想了个办法,用python自带的一个包来运行起来 python -m .
继续访问
Nginx Location作用
一、Nginx location作用 location指令的作用是根据用户请求的URL来执行不同的作用. location语法: location [ = | ~ | ~* | ^~ ] url {......} location [ =|~|~*|^~|@ ] url ...
继续访问
nginx 省略/
nginx
写评论
评论
5
点赞
踩
分享
从JDK1.5开始,Java在java.net包下提供了Proxy和ProxySelector两个类,其中Proxy代表一个代理服务器,可以在打开URLConnection连接时指定所用的Proxy实例,也可以在创建Socket连接时指定Proxy实例。而ProxySelector代表一个代理选择器,它提供了对代理服务器更加灵活的控制,它可以对HTTP、HTTPS、FTP、SOCKS等分别设置,而且还可以设置不需要通过代理服务器的主机和地址。通过使用ProxySelector可以达到像在Internet Explorer、FireFox等软件中设置代理服务器类似的效果。
代理服务器的功能就是代理网络用户去取得网络信息。我们使用网络浏览器直接连接其他Internet站点取得网络信息时,通常需要发送Request请求来等到响应。代理服务器是介于浏览器和Web服务器之间的一台服务器,有了它之后,浏览器不是直接到Web服务器去取得网页数据而是向代理服务器发出请求,Request请求会先送到代理服务器,由代理服务器来取回浏览器所需要的信息并送回给网络浏览器。而且,大部分代理服务器都具有缓冲的功能,就好像一个大的Cache,它有很大的存储空间,它不断将新取得的数据储存到它本机的存储器上,如果浏览器所请求的数据在它本机的存储器上已经存在而且是最新的,那么它就不重新从Web服务器取数据,而直接将存储器上的数据传送给用户的浏览器,这样就能显著提高浏览速度和效率。归纳起来代理服务器主要提供如下两个功能:
突破自身IP限制,对外隐藏自身IP地址。突破IP限制包括访问国外受限站点,访问国内特定单位、团体的内部资源。
提高访问速度,代理服务器提供的缓冲功能可以避免每个用户都直接访问远程主机,从而提高客户端访问速度。
17.5.1 直接使用Proxy创建连接
Proxy有如下一个构造器:Proxy(Proxy.Type type, SocketAddress sa):创建表示代理服务器的Proxy对象。而sa参数指定代理服务器的地址,其中type是该代理服务器的类型,该服务器类型有如下三种:
(1)Proxy.Type.DIRECT:表示直接连接或缺少代理。
(2)Proxy.Type.HTTP:表示高级协议的代理,如 HTTP 或 FTP。
(3)Proxy.Type.SOCKS:表示 SOCKS(V4 或 V5)代理。
一旦创建了Proxy对象之后,程序就可以在使用URLConnection打开连接时,或创建Socket连接时传入一个Proxy对象,作为本次连接所使用的代理服务器。
其中URL包含了一个URLConnection openConnection(Proxy proxy)方法,该方法使用指定的代理服务器来打开连接;而Socket则提供了一个Socket(Proxy proxy)构造器,该构造器使用指定的代理服务器创建一个没有连接的Socket对象。
下面以URLConnection为例来介绍如何在URLConnection中使用代理服务器。
程序清单:codes/17/17-5/ProxyTest.java
上面代码第一行粗体字代码创建了一个Proxy对象,第二行粗体字代码就是用Proxy对象来打开URLConnection连接。除此之外,该程序的其他地方就是对URLConnection的使用了。由此可见, JDK1.5提供了对代理服务器很好的支持。
17.5.2 使用ProxySelector选择代理服务器
前面介绍的直接使用Proxy对象可以在打开URLConnection或Socket时指定代理服务器,使用这种方式需要每次打开连接都显式设置代理服务器。如果想让系统打开连接时总是具有默认的代理服务器,则可以使用java.net.ProxySelector,它可以它根据不同的连接使用不同的代理服务器。
系统默认的ProxySelector会检测各种系统属性和URL协议,然后决定怎样连接不同的主机。当然,程序也可以调用ProxySelector类的setDefaultI()静态方法来设置默认代理服务器,也可以调用getDefault()方法获得系统当前默认的代理服务器。
程序可以通过System类来设置系统的代理服务器属性,关于代理服务器常用的属性名有如下三个:
http.proxyHost:设置HTTP访问所使用的代理服务器地址。该属性名的前缀可以改为https、ftp等,分别用于设置HTTP访问、安全HTTP访问和FTP访问所用的代理服务器地址。
http.proxyPort:设置HTTP访问所使用的代理服务器端口。该属性名的前缀可以改为https、ftp等,分别用于设置HTTP访问、安全HTTP访问和FTP访问所用的代理服务器端口。
http.nonProxyHosts:设置HTTP访问中不需要使用代理服务器的远程主机,可以使用*通配符,如果有多个地址,多个地址用竖线(|)分隔。
下面程序示范了通过改变系统属性来改变默认的代理服务器。
程序清单:codes/17/17-5/ ProxySelectorTest.java
上面程序中三行粗体字代码设置Java打开HTTP访问时的代理服务器属性,其中前两行代码设置代理服务器的地址和端口,第三行代码设置该代理HTTP访问哪些主机时不需要使用代理服务器。上面程序的①行代码处直接打开一个URLConnection,但系统会为打开该URLConnection时使用代理服务器。
运行上面程序,将会看到程序长时间等待,因为192.168.0.96通常并不是有效的代理服务器(当然,如果读者运行的机器恰好可以使用地址为192.168.0.96的代理服务器又另当别论)。
系统提供了默认的ProxySelector子类作为代理选择器,开发者可以实现自己的代理选择器,程序可以通过继承ProxySelector来实现自己的代理选择器。继承ProxySelector需要重写两个方法:
List<Proxy>select(URI uri):实现该方法让代理选择器根据不同的URI来使用不同的代理服务器,该方法就是代理选择器管理网络连接使用代理服务器的关键。
connectFailed(URI uri, SocketAddress sa, IOException ioe):当系统通过默认的代理服务器建立连接失败后,代理选择器将会自动调用该方法。通过重写该方法可以对连接代理服务器失败的情形进行处理。
系统默认的代理服务器选择器也重写了connectFailed方法,它重写该方法的处理策略是:当系统设置的代理服务器失败时,默认代理选择器将会采用直连的方式连接远程资源,所以当运行上面程序等待了足够长时间时,程序依然可以打印出该远程资源的所有内容。
有两种方法可以达到这个目的:1. 删除TCP/IP协议的DNS服务器,然后,修改windows\system32\drivers\etc目录下的hosts文件,用记事本打开,在最下面添加一行:
(IP地址) (网址)
比如:
61.135.253.11www.163.com
保存。这样,就只有hosts文件里面指定的网址可以访问了。注意左边的IP地址必须是右边网址的正确的IP地址,用ping www.163.com 命令可以得到IP地址。
2. 用组策略里面的IP安全策略,添加两个筛选器,第一个筛选器是允许从本地访问远程指定的IP地址;第二个筛选器是禁止本地访问远程所有IP地址,两个筛选器的顺序不能错。
至于IP安全策略,我空间有图解。
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)