Nginx Location 配置说明

Nginx Location 配置说明

    • location语法
    • 五种修饰符
    • 实例说明
    • 容易误解的地方
    • root和alias的区别
    • 应用案例

location语法

Nginx location块 可以放置在server块内或另一个 location块内,语法为:

location [modifier] [URI] {
  ...
  ...
}



五种修饰符

location块中的修饰符modifier是可选的,修饰符有:

  • none:如果location块中不存在修饰符,则与请求URI的开头匹配。
  • =:用于将location块与请求的URI完全匹配。
  • ~:用于区分大小写的正则表达式与请求的 URI 匹配。
  • ~*:用于与请求的 URI 进行不区分大小写的正则表达式匹配。
  • ^~:用于对请求的 URI 执行最长的非正则表达式匹配。如果请求的 URI 命中此location块,则不会发生进一步的匹配。

优先级别如下

优先级 修饰符 支持正则 匹配模式 同级存在多个匹配
1 = 完全匹配 报重复冲突
2 ^~ 前缀匹配 匹配前缀最长的一个,如果完全相同则报重复冲突
3 ~~* 通配符匹配 匹配第一个
4 none 前缀匹配 匹配前缀最长的一个,如果完全相同则报重复冲突

实例说明

参考nginx官方文档的一个例子

	location = / {
		#[ configuration A ]
		return 200 "configuration A";	    
	}

	location / {
		#[ configuration B ]
		return 200 "configuration B";
	}

	location /documents/ {
		#[ configuration C ]
		return 200 "configuration C";
	}

	location ^~ /images/ {
		#[ configuration D ]
		return 200 "configuration D";
	}


	location ~* \.(gif|jpg|jpeg)$ {
		#[ configuration E ]
		return 200 "configuration E";
	}

请求 / 返回configuration A
请求 /index.html 返回configuration B
请求 /documents/document.html 返回configuration C
请求/images/1.gif 返回configuration D
请求/documents/1.jpg 返回configuration E



容易误解的地方

很多人对 ^~~^ 分不清。
其实location修饰符只有^~ ,并没有 ~^
~^ 实际是 修饰符~后面加^开头的正则表达式:
例如 location ~ ^/id/\d+ 匹配 /id/123 的请求
因为nginx配置文件对间隔符的兼容忽略,写成location ~^/id/\d+ 也同样有效。
为了配置的可读性,建议 ~ ^ 不要写成~^



root和alias的区别

注意location中root和alias的区别

当设置 root 的时候:

location /i/ {
    root /data/w3;
}

请求 /i/top.gif 将访问 /data/w3/i/top.gif



当设置 alias 的时候:

location /i/ {
    alias /data/w3/images/;
}

请求 /i/top.gif 将访问 /data/w3/images/top.gif



应用案例

把前端页面/tags/* 路径误写成/tag/* 进行纠正

location ~ ^/tag/(.+) {
  if ($query_string) {
    return 301 /tags/$1?$query_string;
  }
  return 301 /tags/$1;
}

静态文件设置长远时间过期,这样就会在浏览器中缓存更长时间

# Set expires to year on static file types
location ~* ^.+\.(css|js|jpg|jpeg|gif|webp|png|ico|gz|svg|svgz|ttf|otf|woff|woff2|eot|mp4|ogg|ogv|webm|mp4)$ {
  expires 365d;
  access_log off;
}

access日志中不记录favicon图标请求日志

location ~ (?:apple-touch-.*|favicon.*)\.(?:png|ico) {
  log_not_found off;
  access_log off;
}

防止外站盗链图片

location ~ .(png|gif|jpe?g)$ {
    valid_referers none blocked yourwebsite.com *.yourwebsite.com;
    if ($invalid_referer) {
        return   403;
    }
}

防止可写目录中的脚本访问

location ~* /(media|images|cache|tmp|logs)/.*.(php|jsp|pl|py|asp|cgi|sh)$ {
    return 403;
}

你可能感兴趣的:(linux,web,nginx,服务器)