$args |
요청 URL의 요청 지침은 변수에 저장됩니다. 예를 들어 http://IP:8080?arg1=value1&args2=value2의 "arg1=value1&arg2=value2"는 $query_string |
$http_user_agent |
에 액세스하는 사용자의 에이전트 정보를 저장하는 변수입니다. service (브라우징 서버 접속이 브라우저의 해당 버전 정보를 기록하는 경우) 변수는 접속된 서버의 server_name 값을 저장합니다. 변수는 현재 접속 주소의 URI를 저장합니다. 예를 들어 http://IP/server?id=10&name=zhangsan의 "/server"는 $uri |
$document_root |
와 동일한 기능을 가지고 있습니다. 변수는 현재 요청에 해당하는 위치의 루트 값을 저장합니다. 설정되지 않은 경우 기본적으로 Nginx 자체 html 디렉터리의 위치를 가리킵니다 |
$content_length |
변수는 요청 헤더에 Content-Length 값을 저장합니다 |
$content_type |
변수는 요청 헤더에 Content-Type을 저장합니다. 값 |
$http_cookie |
변수는 클라이언트의 쿠키 정보를 저장합니다. add_header Set-Cookie’cookieName=cookieValue’ |
$를 통해 쿠키 데이터를 추가할 수 있습니다. limit_rate |
변수는 네트워크에 대한 Nginx 서버의 응답을 저장합니다. 연결 속도의 제한, 즉 Nginx 구성에서 Limit_rate 명령에 설정된 값, 기본값은 0, 제한 없음 |
$remote_addr |
변수는 클라이언트의 IP 주소를 저장합니다. |
$remote_port |
변수는 클라이언트와 서버 간의 연결을 설정하는 데 사용되는 포트 번호를 저장합니다. |
$remote_user |
변수는 다음 사용자의 이름을 저장합니다. 이를 얻으려면 인증 모듈이 필요합니다. |
$scheme
액세스 프로토콜은 변수 | |
$server_addr
변수에 저장됩니다. |
|
$server_name
클라이언트 요청이 도착하는 서버의 이름이 저장되는 변수 |
|
$server_port
클라이언트 요청이 도착하는 서버의 이름이 저장되는 변수 서버의 포트 번호 |
|
$server_protocol
변수가 저장되는 서버의 포트 번호 "HTTP/1.1"과 같은 클라이언트 요청 프로토콜 버전 |
|
$request_body_file
변수는 백엔드 서버로 전송된 로컬 파일 리소스를 저장합니다. 이름 |
|
$request_method
변수는 "GET", "POST" 등과 같은 클라이언트의 요청 방법. |
|
$request_filename
변수는 현재 요청된 리소스 파일의 경로 이름을 저장합니다. |
|
$request_uri
변수는 다음의 URI를 저장합니다. 현재 요청을 전달하며 http://IP/server?id=10&name=zhangsan |
|
에서 "/server?id=10&name=zhangsanname"과 같은 요청 매개변수를 전달합니다.我们来随机测试下几个指令的使用吧
$args
server {
listen 8081;
server_name localhsot;
location /server {
set $name zhangsan;
set $age 19;
default_type text/plain;
return 200 $name=$age=$args;
}
}
其他的指令有兴趣的同学可以自行尝试,下面使用这些指令完成一个需求
自定义日志输出格式,将请求的日志输出到自定义的日志中
具体配置如下:
log_format main '$remote_addr - $request - $status - $request_uri - $http_user_agent';
server {
listen 8081;
server_name localhsot;
location /server {
access_log logs/access-server.log main;
set $name zhangsan;
set $age 19;
default_type text/plain;
return 200 $name=$age=$args=$http_user_agent;
}
}
通过这种方式,就可以实现自定义请求的相关参数输出到自定义的日志文件中
if指令
该指令用来支持条件判断,并根据条件判断结果选择不同的Nginx配置
condition为判定条件,可以支持以下写法:
1)变量名称,如果变量名对应的值为空或者是0,if都判断为false,其他条件为true
if ($param) {
}
location /testif {
set $username 'zhangsan';
default_type text/plain;
if ($username){
return 200 success;
}
return 200 'params is empty';
}
2) 使用"=“和”!="比较变量和字符串是否相等,满足为true,不满足为false
if ($request_method = POST) {
return 405; 3
}
注意:此处和Java不一样的是字符串不需加引号
3)使用正则表达式对变量匹配
匹配成功返回true,否则返回false;
变量与正则表达式之间使用"“,”“,”!“,”!"来连接;
“~” 代表匹配正则表达式过程中区分大小写;
"~*"代表匹配正则表达式过程中不区分大小写;
"!“和”!*"刚好和上面取相反值,如果匹配上返回false,匹配不上返回true;
if ($http_user_agent ~ MSIE) {
#$http_user_agent的值中是否包含MSIE字符串,如果包含返回 true
}
注意:正则表达式字符串一般不需要加引号,但是如果字符串中包含"}“或者是”;"等字符时,就需要把引号加上
if ($http_user_agent ~ Safari){
return 200 Chrome;
}
4)判断请求文件是否存在使用"-f"和"!-f"
当使用"-f"时,如果请求的文件存在返回true,不存在返回false;
当使用"!f"时,如果请求文件不存在,但该文件所在目录存在返回true,文件和目录都不存在返回false,如果文件存在返回false;
if (-f $request_filename){
#判断请求的文件是否存在
}
if (!-f $request_filename){
#判断请求的文件是否不存在
}
案例展示
location /file {
root html;
default_type text/html;
if (!-f $request_filename){
return 200 '<h2>not find file</h2>';
}
}
当访问目录下不存在的文件时,将会看到如下的异常返回
5) 判断请求的目录是否存在使用"-d"和"!-d"
当使用"-d"时,如果请求的目录存在,if返回true,如果目录不存在则返回false;
当使用"!-d"时,如果请求的目录不存在但该目录的上级目录存在则返回true,该目录和它上级目录都不存在则返回false,如果请求目录存在也返回false;
使用"-e"和"!-e"来检查所请求的目录或文件是否存在
当使用"-e",如果请求的目录或者文件存在时,if返回true,否则返回false;
当使用"!-e",如果请求的文件和文件所在路径上的目录都不存在返回true,否则返回false;
7) 判断请求的文件是否可执行使用"-x"和"!-x"
当使用"-x",如果请求的文件可执行,if返回true,否则返回false;
当使用"!-x",如果请求文件不可执行,返回true,否则返回false; break指令
该指令用于中断当前相同作用域中的其他Nginx配置。在Nginx的配置中,与该指令处于相同作用域的指令中,位于该指令之前的配置生效,位于之后的配置则无效
location /{
if ($param){
set $id $1;
break;
limit_rate 10k;
}
}
案例演示
location /break {
default_type text/plain;
set $username MIKE;
if ($args){
set $username JIM;
break;
set $username JODAN;
}
return 200 $username;
}
return指令
该指令用于完成对请求的处理,直接向客户端返回响应状态代码。在return后的所有Nginx配置都是无效的
location /return {
default_type application/json;
return 200 '{id:1,name:jike}';
}
rewrite指令
该指令通过正则表达式的使用来改变URI。URL可以同时匹配并处理一个或多个指令,按照顺序进行处理
URL和URI的区别
last break redirect permanent
last : 终止继续在本location中处理接收到的URI,并将此处重写的URI作为一个新的URI,使用各location块进行处理。该标志将重写的URI重写在server块中执行,为重写后的URI提供了转入到其他location块的机会;
break : 将此处重写的URI作为一个新的URI,在本块中继续处理,该标志重写后的地址在当前的location块中执行,不会将新的URI转向其他的location块;
redirect : 将重写后的URI返回给客户端,状态码为302,指明是临时重定向URI,主要用在replacement变量不是以 “http://”或“https://”开头的情况;
redirect : 将重写后的URI返回给客户端,状态码为302,指明是临时重定向URI,主要用在replacement变量不是以 “http://”或“https://”开头的情况;
permanent : 将重写后的URI返回给客户端,状态码为301,指明是临时重定向URI,主要用在replacement变量不是以 “http://”或“https://”开头的情况;
示例1
location /rewirte {
rewrite ^/rewrite/url\w*$ https://www.baidu.com;
rewrite ^/rewrite/(test)/\w*$ /$1;
rewrite ^/rewrite/(hello)/\w*$ /$1;
}
location /test {
default_type text/plain;
return 200 "hello success";
}
示例2
location /rewirte {
rewrite ^/rewrite/url\w*$ https://www.baidu.com;
rewrite ^/rewrite/(test)/\w*$ /$1 last;
rewrite ^/rewrite/(hello)/\w*$ /$1 last;
}
location /test {
default_type text/plain;
return 200 "hello success";
}
rewrite_log指令
该指令配置是否开启URL重写日志的输出功能
开启后,URL重写的相关日志将以notice级别输出到error_log指令配置的日志文件汇总
location /rewirte {
rewrite_log on;
error_log logs/error.log notice;
rewrite ^/rewrite/url\w*$ https://www.baidu.com;
rewrite ^/rewrite/(test)/\w*$ /$1 last;
rewrite ^/rewrite/(hello)/\w*$ /$1 last;
}
一、rewrite配置域名跳转
有很多大型网站,在起步的时候,比如域名为 : www.haoyijia.com,但是域名太长所带来的问题就是不方便记忆,于是后面改成 www.hyj.com,问题是,一些老用户之前一直习惯了那个长域名,如何在老用户输入长域名的时候仍然可以跳转到新的短域名上呢?就可以考虑使用rewrite的功能;下面在本地做一下模拟。
配置步骤:
1、准备两个域名
这里我直接在本地模拟2个域名,通过在本地的hosts文件配置下就可以了
2、配置nginx.conf文件
server {
listen 80;
server_name www.zcy.com www.zhangcongyi.com;
rewrite ^/ http://www.jd.com permanent;
}
重启nginx服务,浏览器访问:www.zcy.com 或者www.zhangcongyi.com,观察效果
二、rewrite配置独立域名
一个完整的项目包含多个模块,比如购物网站有商品商品搜索模块、商品详情模块、购物车模块等,那么我们如何为每一个模块设置独立的域名。
server{
listen 80;
server_name search.hm.com;
rewrite ^(.*) http://www.hm.com/bbs$1 last;
}
server{
listen 81;
server_name item.hm.com;
rewrite ^(.*) http://www.hm.com/item$1 last;
}
server{
listen 82;
server_name cart.hm.com;
rewrite ^(.*) http://www.hm.com/cart$1 last;
}
本地的hosts文件添加如下配置
重启nginx服务,可以在浏览器访问下观察效果如何
三、rewrite配置目录合并
搜索引擎优化(SEO)是一种利用搜索引擎的搜索规则,来提供目的网站的有关搜索引擎内排名的方式;
我们在创建自己的站点时,可以通过很多种方式有效提供搜索引擎优化的程度,其中有一项就包含URL的目录层级一般不要超过三层,否则的话不利于搜索引擎的搜索也给客户端的输入带来了负担;
但是将所有的文件放在一个目录下又会导致文件资源管理混乱,并且访问文件的速度也会随着文件增多而慢下来,这两个问题是相互矛盾的,使用rewrite就可以解决上述问题;
举例,网站中有一个资源文件的访问路径时,比如访问:/server/11/22/33/44/20.html,也就是说20.html存在于第5级目录下,如果想要访问该资源文件,客户端的URL地址就要写成http://www.web.name/server/11/22/33/44/20.html;
server {
listen 80;
server_name www.web.com;
location /server{
root html;
}
}
但是这个是非常不利于SEO搜索引擎优化的,同时客户端也不好记,使用rewrite我们可以进行如下配置:
server {
listen 80;
server_name www.web.com;
location /server{
rewrite ^/server-([0-9]+)-([0-9]+)-([0-9]+)- ([0-9]+)\.html$ /server/$1/$2/$3/$4/$5.html last;
}
}