nginx全局变量
rewrite实战
nginx的location配置php
1、nginx全局变量css
https://github.com/aminglinux/nginx/blob/master/rewrite/variable.mdhtml
变量前端 |
说明linux |
$argsnginx |
请求中的参数,如www.123.com/1.php?a=1&b=2的$args就是a=1&b=2git |
$body_bytes_sentgithub |
服务器发送给客户端的响应body字节数web |
$content_length后端 |
HTTP请求信息里的"Content-Length" |
$conten_type |
HTTP请求信息里的"Content-Type" |
$document_root |
nginx虚拟主机配置文件中的root参数对应的值 |
$document_uri |
当前请求中不包含指令的URI,如www.123.com/1.php?a=1&b=2的$document_uri就是1.php,不包含后面的参数 |
$http_referer |
记录这次请求是从哪一个链接访问过来的,能够根据该参数进行防盗链设置 |
$host |
主机头,也就是域名 |
$http_user_agent |
客户端的详细信息,也就是浏览器的标识,用curl -A能够指定 |
$http_cookie |
客户端的cookie信息 |
$http_x_forwarded_for |
当前端有代理服务器时,设置web节点记录客户端地址的配置,此参数生效的前提是代理服务器也要进行相关的x_forwarded_for设置 |
$limit_rate |
若是nginx服务器使用limit_rate配置了显示网络速率,则会显示,若是没有设置, 则显示0 |
$remote_addr |
客户端的公网ip |
$remote_port |
客户端的port |
$remote_user |
若是nginx有配置认证,该变量表明客户端认证的用户名 |
$request |
请求的URI和HTTP协议,如“GET /article-10000.html HTTP/1.1” |
$request_body_file |
作反向代理时发给后端服务器的本地资源的名称 |
$request_method |
请求资源的方式,GET/PUT/DELETE等 |
$request_filename |
当前请求的资源文件的路径名称,至关因而$document_root/$document_uri的组合 |
$request_uri |
请求的连接,包括$document_uri和$args |
$scheme |
请求的协议,如ftp,http,https |
$server_protocol |
客户端请求资源使用的协议的版本,如HTTP/1.0,HTTP/1.1,HTTP/2.0等 |
$server_addr |
服务器IP地址 |
$server_name |
服务器的主机名 |
$server_port |
服务器的端口号 |
$status |
http状态码,记录请求返回的状态码,例如:200、30一、404等 |
$uri |
和$document_uri相同 |
$http_referer |
客户端请求时的referer,通俗讲就是该请求是经过哪一个连接跳过来的,用curl -e能够指定 |
$time_local |
记录访问时间与时区,如18/Jul/2014:17:00:01 +0800 |
2、rewrite实战
域名跳转(域名重定向)
示例1(不带条件的):
server{ listen 80; server_name www.a.com; root /data/wwwroot/www.a.com; index index.html; rewrite /(.*) http://www.b.com/$1 permanent; }
访问a.com跳转到b.com
示例2(带条件的):
server{ listen 80; server_name www.a.com a.com; root /data/wwwroot/www.a.com; index index.html; if ($host != 'www.a.com') { rewrite /(.*) http://www.a.com/$1 permanent; } }
经过判断条件,若是$host不等于www.a.com的,跳转到www.a.com
示例3(http跳转到https):
server{ listen 80; server_name www.a.com; root /data/wwwroot/www.a.com; index index.html; rewrite /(.*) https://www.a.com/$1 permanent; }
示例4(域名访问二级目录)
server{ listen 80; server_name blog.a.com; index index.html; rewrite /(.*) http://www.a.com/blog/$1 permanent; }
示例5(静态请求分离)
server{ listen 80; server_name www.a.com; location ~* ^.+.(jpg|jpeg|gif|css|png|js)$ { rewrite /(.*) http://img.a.com/$1 permanent; } } 或者: server{ listen 80; server_name www.a.com; index index.html; if ( $uri ~* 'jpg|jpeg|gif|css|png|js$') { rewrite /(.*) http://img.a.com/$1 permanent; } }
防盗链
示例6
server{ listen 80; server_name www.a.com; location ~* ^.+.(jpg|jpeg|gif|css|png|js|rar|zip|flv)$ { valid_referers none blocked server_names *.a.com a.com *.tobe.com tobe.com; if ($invalid_referer) { rewrite /(.*) http://img.a.com/images/forbidden.png; } } ....... }
说明:*这里是通配,跟正则里面的*不是一个意思,valid_referers定义白名单,none指的是referer不存在、为空的状况(curl -e 测试),
blocked指的是referer头部的值被防火墙或者代理服务器删除或者假装的状况,
该状况下,referer头部的值不以http://或者https://开头(curl -e 后面跟的referer不以http://或者https://开头)。
或者:
location ~* ^.+.(jpg|jpeg|gif|css|png|js|rar|zip|flv)$ { valid_referers none blocked server_names *.a.com *.tobe.com a.com tobe.com; if ($invalid_referer) { return 403; } }
伪静态
示例7(discuz伪静态):
location / { rewrite ^([^\.]*)/topic-(.+)\.html$ $1/portal.php?mod=topic&topic=$2 last; rewrite ^([^\.]*)/forum-(\w+)-([0-9]+)\.html$ $1/forum.php?mod=forumdisplay&fid=$2&page=$3 last; rewrite ^([^\.]*)/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$ $1/forum.php?mod=viewthread&tid=$2&extra=page%3D$4&page=$3 last; rewrite ^([^\.]*)/group-([0-9]+)-([0-9]+)\.html$ $1/forum.php?mod=group&fid=$2&page=$3 last; rewrite ^([^\.]*)/space-(username|uid)-(.+)\.html$ $1/home.php?mod=space&$2=$3 last; rewrite ^([^\.]*)/(fid|tid)-([0-9]+)\.html$ $1/index.php?action=$2&value=$3 last; }
rewrite多个条件的而且
示例8:
location /{ set $rule 0; #值为0 if ($document_uri !~ '^/abc') #!~不匹配以abc开头的 { set $rule "${rule}1"; #01 } if ($http_user_agent ~* 'ie6|firefox') { set $rule "${rule}2"; #012 } if ($rule = "012") { rewrite /(.*) /abc/$1 redirect; } }
当知足两个条件不以abc开头,而且http_user_agent为ie6或firefox时,跳转到http://www.a.com/aaa/,不知足其中的一个条件时,返回了404
3、nginx的location配置
安装第三方模块echo-nginx-module
cd /usr/local/src/ git clone https://github.com/openresty/echo-nginx-module.git
nginx编译安装后的操做:
cd /usr/local/src/nginx-1.16.1
从新编译
./configure --prefix=/usr/local/nginx --add-module=/usr/local/src/echo-nginx-module make && make install
/usr/local/nginx/sbin/nginx -V
测试中使用,能够在虚拟主机配置文件中直接使用,如:echo 123;
location语法:
nginx location语法规则:location [=|~|~*|^~] /uri/ { … } nginx的location匹配的变量是$uri
符号 | 说明 |
---|---|
= | 表示精确匹配 |
^~ | 表示uri以指定字符或字符串开头 |
~ | 表示区分大小写的正则匹配 |
~* | 表示不区分大小写的正则匹配 |
/ | 通用匹配,任何请求都会匹配到 |
规则优先级:
= 高于 ^~ 高于 ~* 等于 ~ 高于 /
规则示例:
location = "/12.jpg" { ... } 如: www.a.com/12.jpg 匹配 www.a.com/abc/12.jpg 不匹配 location ^~ "/abc/" { ... } 如: www.a.com/abc/123.html 匹配 www.a.com/a/abc/123.jpg 不匹配 location ~ "png" { ... } 如: www.a.com/aaa/bbb/ccc/123.png 匹配 www.a.com/aaa/png/123.html 匹配 location ~* "png" { ... } 如: www.a.com/aaa/bbb/ccc/123.PNG 匹配 www.a.com/aaa/png/123.html 匹配 location /admin/ { ... } 如: www.a.com/admin/aaa/1.php 匹配 www.a.com/123/admin/1.php 不匹配
小常识:
有些资料上介绍location支持不匹配 !~, 如: location !~ 'png'{ ... } 这是错误的,location不支持 !~ 若是有这样的需求,能够经过if来实现, 如: if ($uri !~ 'png') { ... } 注意:location优先级小于if