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