nginx 配置详解root,alias,proxy_pass,proxy_set_header

nginx 配置详解root,alias,proxy_pass,proxy_set_header

1、root和alias

1.root:root指定的目录是上级目录,path匹配的整个路径会追加,即root+path;
	例:location /www/ {
			root /home/data;
		}
那么我们的访问路径为:
访问路径:http://www.abc.com/www/a.html,实际上是访问/home/data/www/a.html。

2.alias:alias指定的目录必须带/,path匹配后面的内容会在alias指定的目录下查找,即alias+匹配到path路径后面的部分。
	例:location /www/ {
			alias /home/data;
		}
那么我们的访问路径为:
访问路径:http://www.abc.com/www/a.html,实际上是访问/home/data/a.html。

2、proxy_pass的斜杠问题

1.path没有斜杠
	location /api1 {
		proxy_pass http://localhost:8080; 
	}
 "http://localhost/api1/xxx" -> "http://localhost:8080/api1/xxx"

	location /api2 {
		 proxy_pass http://localhost:8080/; 
	}
 "http://localhost/api2/xxx" -> "http://localhost:8080/xxx"

	location /api5 { 
		proxy_pass http://localhost:8080/haha; 
	}
 "http://localhost/api5/xxx" -> "http://localhost:8080/haha/xxx"
	⬆
 请注意这里的这里的双斜线。

2)path有斜杠
	location /api1/ { 
		proxy_pass http://localhost:8080; 
	}
 "http://localhost/api1/xxx" -> "http://localhost:8080/api1/xxx"

	location /api2/ {
	 proxy_pass http://localhost:8080/;
	}
 "http://localhost/api2/xxx" -> "http://localhost:8080/xxx"

	location /api5/ {
	 	proxy_pass http://localhost:8080/haha; 
	}
 "http://localhost/api5/xxx" -> "http://localhost:8080/hahaxxx"
	⬆
 请注意这里的haha和xxx之间没有斜杠。

3)index 选项
index后面可以跟多个设置,如果访问的时候没有指定具体访问的资源,则会依次进行查找,找到第一个为止。

举例:
	location / {
		root /usr/local/nginx/html;
		index index.html index.htm;
	}
访问该location的时候,可以通过 http://ip:port/,地址后面如果不添加任何内容,
则默认依次访问index.html和index.htm,找到第一个来进行返回

4) proxy_set_header Host
4.1)不设置 proxy_set_header Host 时,浏览器直接访问 nginx,获取到的 Host 是 proxy_pass 后面的值,即 $proxy_host 的值

	server{
		listen 8080;
		server_name _;
		loaction / {
			proxy_pass http://172.101.168.119:5000;
		}
	}
结果如下:返回proxy_pass 后面的值
浏览器输入:localhost:8080 返回的内容为:{"Host":"172.101.168.119.5000"}

4.2)设置 proxy_set_header Host $host
注意:localhost为回环地址为:127.0.0.1在计算机网络中属于一个特殊的ip地址。
	server{
		listen 8080;
		server_name _;
		loaction / {
			proxy_set_hearder Host $host;
			proxy_pass http://172.101.168.119:5000;
		}
	}
结果如下:不再是 proxy_pass代理的ip地址了, 不包含端口
浏览器输入:localhost:8080 返回的内容为:{"Host":"127.0.0.1"}

4.3) 设置proxy_set_header Host $http_host

	server{
		listen 8080;
		server_name _;
		loaction / {
			proxy_set_hearder Host $http_host;
			proxy_pass http://172.101.168.119:5000;
		}
	}
结果如下:不再是 proxy_pass代理的ip地址了, 包含端口
浏览器输入:localhost:8080 返回的内容为:{"Host":"127.0.0.1:8080"}

总结

path有无斜杠无影响,主要看proxy_pass有没有斜杠。proxy_pass没有的话,proxy_pass+path;有的话(包括端口和上下文都是一样的),proxy_pass+匹配到path路径后面的部分。

nginx location正则表达式

location  = / {
  # 精确匹配 / ,主机名后面不能带任何字符串
  [ configuration A ] 
}
 
location  / {
  # 因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求
  # 但是正则和最长字符串会优先匹配
  [ configuration B ] 
}
 
location /documents/ {
  # 匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索
  # 只有后面的正则表达式没有匹配到时,这一条才会采用这一条
  [ configuration C ] 
}
 
location ~ /documents/Abc {
  # 匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索
  # 只有后面的正则表达式没有匹配到时,这一条才会采用这一条
  [ configuration CC ] 
}
 
location ^~ /images/ {
  # 匹配任何以 /images/ 开头的地址,匹配符合以后,停止往下搜索正则,采用这一条。
  [ configuration D ] 
}
 
location ~* \.(gif|jpg|jpeg)$ {
  # 匹配所有以 gif,jpg或jpeg 结尾的请求
  # 然而,所有请求 /images/ 下的图片会被 config D 处理,因为 ^~ 到达不了这一条正则
  [ configuration E ] 
}
 
location /images/ {
  # 字符匹配到 /images/,继续往下,会发现 ^~ 存在
  [ configuration F ] 
}
 
location /images/abc {
  # 最长字符匹配到 /images/abc,继续往下,会发现 ^~ 存在
  # F与G的放置顺序是没有关系的
  [ configuration G ] 
}
 
location ~ /images/abc/ {
  # 只有去掉 config D 才有效:先最长匹配 config G 开头的地址,继续往下搜索,匹配到这一条正则,采用
    [ configuration H ] 
}
 
location ~* /js/.*/\.js

你可能感兴趣的:(nginx,运维,java)