根据hostname进行api访问限制
根据hostname对访问api进行配置。
location /flow-service/
{
if ($host = "hostname.com")
{
return 403;
}
}
- $host:nginx自带的变量,可以获取到当前的hostname
- 最后需要有location 那一行最后要有一个/
- return 403,当访问该api时,会被nginx进行拦截,返回403,且显示nginx默认的403页面
- 相等判断使用‘=’
- 字符串使用“”框起来
配置页面访问限制
Nginx会算一个权重,因此直接进行显示配置如:
location /url
会直接算为对api的配置,直接跳转到后端
配置页面访问限制需要配置如:
location /url/url
{
root xxxx;
try_files xxx;
allow xxx;
deny xxx;
if (xxxx)
{
return 403/404;
}
}
多条件判断
- Nginx中没有逻辑运算,因此需要写多个 if 而不是使用 || 或者 && 等运算符。
精确匹配与模糊匹配差别
location =/ { … } 与 location / { … } 的差别:
- 前一个是精确匹配,只响应/请求,所有/xxx或/xxx/xxxx类的请求都不会以前缀的形式匹配到它
- 后一个是只要以 / 为前缀的请求都会被匹配到。如:/abc , /test/abc, /test/abc/aaaa
正则匹配
- location ~ /test/.+.jsp$ { … } :正则匹配,支持标准的正则表达式语法。
- 波浪号(~):表示执行正则匹配,但区分大小写
- 波浪号与星号(~*):表示执行正则匹配,但不 区分大小写
- location ^~ / { … } : ^~意思是关闭正则匹配,当搜索到这个普通匹配模式后,将不再继续搜索正则匹配模式。
遇到的问题:
- “proxy_pass” cannot have URI part in location given by regular expression
原因:proxy_pass 不能写在正则表达式 / if / limit_except 中
解决方案:在proxy_pass 后边的uri的最后添加“$1”。
如:(仅针对API)
location ~ ^/([A-Za-z0-9]+) {
proxy_pass http://api/urlshortener/v1/$1;
}
或者
location ~ /backend-service/(.*)/static-url {
proxy_pass <%= ENV["DATA_SERVICE_PATH"] %>$1/static-url;
}
// $1, $2, $3等表示第几个正则表达式变量,正则表达式变量需要用()括起来。
location /backend-service/data {
proxy_pass <%= ENV["DATA_SERVICE_PATH"] %>data;
// ENV["DATA_SERVICE_PATH"] = http://website.xxx.xxxx.cn/
}
(<%= ENV["DATA_SERVICE_PATH"] %> 变量可以直接后续想要添加的内容)
如果是页面需要,需要在前边写一个rewrite:
location ~ /backend-service/.+./tableau-url {
rewrite ^ .+./tableau-url $1
proxy_pass <%= ENV["DATA_SERVICE_PATH"] %>$1;
}