nginx的匹配顺序:
- 1、完全匹配
- 2、通配符在前的,如*.test.com
- 3、通配在后的,如www.test.*
- 4、正则匹配,如~^.www.test.com$
那么我们平时会用到比如nginx做负载配置、做二级域名泛匹配。那么这里就主要说一下这两个问题
首先说一下nginx中一些参数可以直接使用的
$args, 请求中的参数;
$content_length, HTTP请求信息里的"Content-Length";
$content_type, 请求信息里的"Content-Type";
$document_root, 针对当前请求的根路径设置值;
$document_uri, 与$uri相同;
$host, 请求信息中的"Host",如果请求中没有Host行,则等于设置的服务器名;
$limit_rate, 对连接速率的限制;
$request_method, 请求的方法,比如"GET"、"POST"等;
$remote_addr, 客户端地址;
$remote_port, 客户端端口号;
$remote_user, 客户端用户名,认证用;
$request_filename, 当前请求的文件路径名
$request_body_file
$request_uri, 请求的URI,带查询字符串;
$query_string, 与$args相同;
$scheme, 所用的协议,比如http或者是https,比如rewrite ^(.+)$ $scheme://example.com$1 redirect;
$server_protocol, 请求的协议版本,"HTTP/1.0"或"HTTP/1.1";
$server_addr, 服务器地址,如果没有用listen指明服务器地址,使用这个变量将发起一次系统调用以取得地址(造成资源浪费);
$server_name, 请求到达的服务器名;
$server_port, 请求到达的服务器端口号;
$uri, 请求的URI,可能和最初的值有不同,比如经过重定向之类的。
- nginx做负载配置
我使用到配置方式文件如下:
###去水印域名
upstream apigatewayurl
{
server 172.18.65.108:8801 weight=40 max_fails=20 fail_timeout=30s;
server 172.18.65.108:8802 weight=40 max_fails=20 fail_timeout=30s;
ip_hash;
}
###域名
server {
listen 80;
server_name www.xxxx.com;
### 防止抓取配置
include /usr/local/nginx/conf/agent_deny.conf;
location /api/ {
proxy_pass http://apigatewayurl/;
proxy_set_header host $host;
proxy_set_header clientIP $remote_addr;
proxy_set_header forwarded-for $proxy_add_x_forwarded_for;
}
}
防止抓取配置(注:如果有需要向外提供接口的不要加入这个配置)
#crapy等工具的抓取
if ($http_user_agent ~* (Scrapy|Curl|HttpClient)) {
return 403;
}
#禁止指定UA及UA为空的访问
if ($http_user_agent ~ "WinHttp|WebZIP|FetchURL|node-superagent|java/|FeedDemon|Jullo|JikeSpider|Indy Library|Alexa Toolbar|AskTbFXTV|AhrefsBot|CrawlDaddy|Java|Feedly|Apache-HttpAsyncClient|UniversalFeedParser|ApacheBench|Microsoft URL Control|Swiftbot|ZmEu|oBot|jaunty|Python-urllib|lightDeckReports Bot|YYSpider|DigExt|HttpClient|MJ12bot|heritrix|EasouSpider|Ezooms|BOT/0.1|YandexBot|FlightDeckReports|Linguee Bot|^$" ) {
return 403;
}
#禁止非GET|HEAD|POST方式的抓取
if ($request_method !~ ^(GET|HEAD|POST|OPTIONS)$) {
return 403;
}
- nginx做反向文件代理有三种
(1). 直接取某一个指定的文件,如苹果在微信开放平台上的Ulink
### 苹果需要的Ulink 文件
location ~* apple-app-site-association$ {
default_type application/json;
alias /file/xxxxx..../apple-app-site-association;
##index fileauth.txt;
}
(2)、root直接文件配置
location / {
root /file/jianbianassets/policy/;
index potato_privacy.html;
}
(3)、使用alias配置
location /assets/ {
alias /file/assets/;
}
3、ngin泛二级域名配置,不用每次添加一个二级域名都去修改nginx配置,直接上代码
server {
server_name ~^((?<subdomain>.*)\.)?(?<domain>[^.]+)\.com$;
listen 80;
include /usr/local/nginx/conf/agent_deny.conf;
if ($subdomain = "") {
## 如果前面省略,那么可以使用设置值 或重定向
#set $subdomain "www";
rewrite www.${domain}.com
}
location / {
index index.html;
root /home/jar/xxx/website/web_${domain}/${subdomain};
}
}
如你的域名为 video.ezhanshuju.com 那么你对应的文件路径就应该是在
/home/jar/xxx/website/web_ezhanshuju/video/路径下
4、重定向
rewrite 指令:可以使用在 server, location, if 区域;
语法:rewrite regex replacement flag
按照相关的正则表达式与字符串修改URI,指令按照在配置文件中出现的顺序执行。
可以在重写指令后面添加标记。
如果替换的字符串以http://开头,请求将被重定向,并且不再执行多余的rewrite指令。
尾部的标记(flag)可以是以下的值:
- last - 完成重写指令,之后搜索相应的URI或location。
- break - 完成重写指令。
- redirect - 返回302临时重定向,如果替换字段用http://开头则被使用。
- permanent - 返回301永久重定向。