例子:
以上一些配置为在该server下具有全局性,例如 root ,可在location中重新定义root
当我们想定义多个server监听同一个端口但访问的host不一样时,server_name就派上用场了。nginx会根据HTTP请求的header Host选择nginx配置文件里符合条件的server_name的server配置
匹配顺序如下
所以当我们监听的的端口只有一个server配置的时候,server_name 可以不填
两者作用差不多,区别在于最终映射的地址不同,例:
简单例子,匹配所有请求
一个正则匹配的例子:
一个反向代理的例子:
vue-router、react-router等路由框架要开启history模式可以选择的nginx配置的例子
location的匹配规则和顺序
还有一种特殊匹配类型 @url ,只用于nginx内部跳转,例:
例子:
有常用两种负载均衡支持调度算法,分别是 weight 和 ip_hash 。weight 模式下可以为每个 server 设置weight值,weight值越大,分配到的访问机率越高,ip_hash 为同一个ip的
分配同一个后端服务器,这样我们不用解决session共享问题。
例子:
mime type 和 文件扩展名的对应关系一般放在 mime.types 里,然后 用 include mime.types
mime.types作用:通过文件的扩展名设置了Content-Type,Nginx如果没找到对应文件的扩展名的话,就使用默认的Type,默认Type通用 default_type 定义,比如 default_type application/octet-stream
完整的 mime.types 配置: https://github.com/h5bp/server-configs-nginx/blob/master/mime.types
一个虚拟主机对一个文件配置,放到vhost文件夹下面,然后通过include指令包含进来,这样更便于维护和管理
配置:
参考:
http://tool.oschina.net/apidocs/apidoc?api=nginx-zh
https://www.jianshu.com/p/bed000e1830b
Content-Type属性指定请求和响应的 HTTP 内容类型。如果未指定 ContentType,默认响应的内容类型为 text/html ,默认请求的内容类型为 application/x-www-form-urlencoded 。Content-Type一般只存在于Post方法中,因为Get方法是不含“body”的,它的请求参数都会被编码到url后面,所以在Get方法中加Content-type是无用的。
在 nginx 中有个配置文件 mime.types ,主要是标示 Content-Type 的文件格式。
下面是几个 常见的 Content-Type :
application/x-www-form-urlencoded 是常用的表单发包方式,普通的表单提交,或者 js 发包,默认都是通过这种方式,数据被编码为key/value格式发送到服务器。
multipart/form-data 用在 发送文件的POST包 。
Multipart/form-data的请求头必须包含一个特殊的头信息 : Content-Type , 且其值也必须规定为multipart/form-data , 同时还需要规定一个 内容分割符 即 boundary 用于分割请求体中的多个POST的内容 , 如文件内容和文本内容自然需要分割开来 , 不然接收方就无法正常解析和还原这个文件了。
text/xml 微信用的是这种数据格式发送请求的。XML-RPC(XML Remote Procedure Call)是一种使用 HTTP 作为传输协议,XML 作为编码方式的远程调用规范。
application\json HTTP通信中并不存在所谓的json,而是将string转成json罢了,也就是,application/json可以将它理解为text/plain,普通字符串。
application\xml XML数据格式
MDN Content-Type
理解HTTP之Content-Type
四种常见的POST提交数据方式
nginx中location对url匹配;
语法:location [=| | *|^~] /uri/ { … }
当匹配中符合条件的location,则执行内部指令;如果使用正则表达式,必须使用 *表明不区分大小写或者 区分大小写匹配;例如:location ~* .(gif|jpg|jpeg)$ ;当配皮成功后,将停止往下匹配;如果没有找到,则使用常规自字符串处理结果;
如果不是用正则表达式;可使用=严格匹配;
如果使用^~前缀用于一个常规字符串;表示如果路径匹配,则不测试正则表达式;
总结:指令按下列顺序被接受
1:=前缀的指令严格匹配这个查询;如果找到停止往下匹配
2:挣下的常规字符串,长的在前,如果这个匹配使用^~前缀,匹配停止;
3:正则表达式,按配置文件的顺序;
4:如果第三步产生匹配。则使用这个结果;停止匹配;否则使用第二部的匹配结果;
四个案例:
八个location案例
当匹配成功后location中可以使用rewrite进行路由重写;
首先需要了解nginx rewrite中可以使用到的全局变量;
$args:请求中get的参数,例如a=1&b=2
$body_remote_add:二进制客户地址
$body_byte_sent:相应时发送出去的body字节数数量,即使链接中断这个数据也是精确的;
$content_length:请求头中的Content_length字段
$content_type:请求中的Content_type字段
$document_root:当前请求在root指令中的位置服务器中绝对路径
$document_url:与uri相同
$host:请求主机头字段,否则为服务器名称;
$hostname:保存了当前请求中不包含指令的uri,例如: http://www.aaa.com/index.php?a=1 中的/index.php
$host:请求的服务器名称;
$http_user_agent:客户端浏览器的详细信息,如果使用 chrome 和Firefox 则访问结果是
location ~* .(gif|jpg|png|bmp) invalid_referer) {
return 403
#rewrite ^/ http://www.aaa.com/1.jpg
}
}以上所有来至aaa.com和域名中包含google和baidu的站点都可以访问到当前站点的图片,如果来源域名不在这个列表中,那么$invalid_referer等于1,在if语句中返回一个403给用户,这样用户便会看到一个403的页面,如果使用下面的rewrite,那么盗链的图片都会显示403.jpg。如果用户直接在浏览器输入你的图片地址,那么图片显示正常,因为它符合none这个规则.
location ~* .(gif|jpg|png|swf|flv) invalid_referer) {
return 404
}
}
none:在浏览器输入网站域名直接访问的请求,需要允许访问的
blocked:有referer首部,但是referer首部被清除了,一般是防火墙改过的请求
server_name:带服务器名称的,一般是本机或其他服务器的请求,a.com和*.a.com是本公司的域名,要允许访问于是要先允许本机的访问,再禁止其他服务器的访问
location /public/admin/images/y.jpg {
#valid_referers none blocked *.aaa.com server_names *.aaa.com
#valid_referers none blocked www.sss.com #设置只有该域> 名可以访问
valid_referers none blocked 111.111.111.11#设置只有该域名可以访> 问
if ( request_uri?
return 403
rewrite ^/ http://www.aaa.com/1.jpg
}
}
. : 匹配除换行符以外的任意字符
? : 重复0次或1次
if ( /msie/$1 break
}
if ( )") { # 如果cookie匹配正则,就设置变量 id id等于正则第一个括号内匹配的部分
}
if ($request_method = POST) { #如果提交方法为POST,则返回状态405(Method not allowed)。return不能返回301,302
return 405
}
if ( slow可以通过 set 指令设置
limit_rate 10k
}
if (!-f $request_filename){ #如果请求的文件名不存在,则反向代理到localhost 。这里的break也是停止rewrite检查
break
proxy_pass http://127.0.0.1
}
if ($args ~ post=140){ #如果query string中包含"post=140",永久重定向到example.com
rewrite ^ http://example.com/ permanent
}
http {
# 定义image日志格式
log_format imagelog '[ image_file ' ' body_bytes_sent ' ' $status
# 开启重写日志
rewrite_log on
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)