# Rewrite功能配置 # Rewrite功能主要是实现了url重写 # 如:你输入www.jd123.com,你可以通过Rewrite让它重定向到www.jd.com # Rewrite的实现依赖与PCRE的支持,因此要使用先你需要先安装OCRE库。 # Nginx使用的是ngx_http_rewrite_module模块来解析和处理rewrite功能的相关配置的。 # Rewrite相关指令 # set指令:该指令用来设置一个新的变量。 # 语法: set $variable vale; # 默认:空 # 位置:server、location、if server { listen 8081; server_name localhost; location /server { set $name TOM; set $age 18; default_type text/plain; return 200 $name=$age; } } # Rewrite常用全局变量 # $args:变量中存放了请求URL中的请求参数。比如:http://192.168.200.133/server?arg1=value1&args2=value2中的"arg1=value1&args2=value2"。功能和$query_string一样。 # $http_user_agent:变量存储的是用户访问服务器的代理信息(如果是浏览器访问,记录的是浏览器的相关版本信息) # $host:访问服务器的server_name。 # $document_uri:存储的是当前访问地址的URI。比如:http://192.168.200.133/server?arg1=value1&args2=value2中的"/server"和$uri # $document_root:变量存储的是当前请求对应的location的root值。 # $document_length:存储的是请求头中的Content-Length的值。 # $content_length:存储的是请求头中的Content-Type。 # $http_cookie:存储的是客户端的cookie信息,可以通过add_header Set-Cookie 'cookieName=value'来添加cookie数据。 # $limit_rate:存储的是Nginx服务器对网络链接速率的限制,也就是Nginx配置中的limit_rate指令设置的值,默认是0,不限制。 # $remote_addr:存储1是客户端的ip地址。 # $remote_port:客户端与服务端建立链接的端口。 # $remote_user:存储的了客户端的用户名,需要有认证模块才能获取。 # $scheme:存储了访问的协议。http、https…… # $server_addr:存储了服务器的地址。 # $server_name:服务器的名称。 # $server_port:服务器的端口。 # $server_protocol:客户端请求协议的版本。如:HTTP/1.1 # $request_body_file:存储了发给后端服务器的本地文件资源的名称。 # $request_method:客户端请求服务器的方式。get、post等 # $request_filename:当前请求的资源文件的路劲名。 # $request_uri:存储了当前请求的URI,并且附带请求参数,比如:http://192.168.200.133/server?arg1=value1&args2=value2中的"/server?arg1=value1&args2=value2" # 这些变量也都可以在log中使用 server { listen 8081; server_name localhost; log_format main '$remote_addr - $request - $status'; location /server { set $name TOM; set $age 18; access_log logs/access.log main; default_type text/plain; return 200 $name=$age; } } # if指令:条件判断 # 语法:if (condition){...} # 位置:server、location location /testif { set &username 'ROSE'; default_type text/plain; if ($args){ # 当$args等于0或者没有值的时候返回False return 200 success; } if ($requests_method = POST){ #是post请求过来的为真,否则为假。!=:和=相反 RETURN 405; } if ($http_user_ahent ~* safari){ # 当$http_user_ahent包含safari的时候为真。safari你可以写成你的正则表达式。~和~*的区别是~*不区分大小写。 return 200 Chrome; } return 200 error; } # "-f"和"!-f"判断请求文件是否存在。 # "-d"和"!-d"判断请求目录是否存在。 # "-e"和"!-e"判断请求文件或者目录是否存在。 # "-x"和"!-x"判断请求的文件是否是可执行文件。 location / { root html; if (!-f $request_filename){ # 如果文件不存在就返回file not found! return 200 '<h1> file not found!</h1>'; } } # break指令 # 该指令用于终端当前相同作用域中的其他Nginx配置。与该指令处于同一作用域的Nginx配置中,位于它前面的指令配置生效,位于后面的指令配置无效。 # 并且break还有另外一个功能就是终止当前匹配并把当前的URI在本location进行重定向访问处理。 # 位置 server、location、if # 例子: location /testbreak { default_type text/plain; set $username JERRY; if ($args){ set $username TOM; # 执行 break; set $username ROSE; # 不执行 } add_header username $username; # 执行 return 200 'username $username'; # 重定向到 index index.html 这里我们没有配置index所以它走的默认dindex值。这就是上面说的终止当前并把当前的URI在本location重定向访问处理。 } # return 指令 # 语法一:return code [text]; # 语法二:return code URL; # 语法三:return URL; 相当于:return 302 URL; 302就是重定向的相应码。 # 位置:server、location、if # rewrite指令:该指令通过正则表达式的使用来改变URI。可以同时存在一个或者多个指令,按照顺序一次对URL进行匹配和处理。 # 语法:rewrite regex replacement [flag]; //flag默认值:last # 位置:server、location、if # flag: last | break | redirect | permanent # regex:用来陪陪URI的正则表达式 # replacement:匹配成功后,用于替换URI中被截取内容的字符串、如果该字符串式以"http://"或者"https://"开头的,则不会继续向下对uri进行其他处理,而是直接返回重写后的URI给客户端。 # 例子: location /rewrite { rewrite ^/rewrite/url\w*$ https://www.baidu.com; # 这里重定向跳转到www.baidu.com rewrite ^/rewrite/(test)\w*$ /$1; # 这里重定向到location /test rewrite ^/rewrite/(demo)\w*$ /$1; # 这里重定向到location /demo } location /test { default_type text/plain; return 200 test_success; } location /demo { default_type text/plain; return 200 demo_success; } # flag的用法 location /testflag { default_type text/plain; return 200 testflag_success; } location /rewriteflag { rewrite ^/rewrite/(testflag)\w*$ /$1; # rewrite ^/rewrite/(testflag)\w*$ /$1 last; //当匹配成功后会在location所在的整个server中找到/testflag location然后返回,并且浏览器中的地址不会发生任何重定向的变化 # rewrite ^/rewrite/(testflag)\w*$ /$1 break; //当匹配成功后会在当前location中查找访问的资源,然后返回给浏览器。这里访问的路劲是:rewriteflag/html/index.html # rewrite ^/rewrite/(testflag)\w*$ /$1 redirect;//临时重定向到 "location /testflag",浏览器地址会变动 # rewrite ^/rewrite/(testflag)\w*$ /$1 permanent;//永久重定向到 "location /testflag",浏览器地址会变动 } # rewrite_log指令 # 该指令配置是否开启URL重写日志的输出功能 # 语法:rewrite_log on | off # 默认:off # 位置:http、server、location、if # 开启后,URL重写的相关日志将以notice级别输出到error指令配置的日志文件中去。 rewrite_log on; error_log logs/error.log notice; # 这里错误日志级别设置为notice。 # 案例:域名跳转 server { listen 80; server_name www.it.com; location /test { default_type text/plain; return 200 test_success; } } server { listen 80; server_name www.abc.com www.abc.ccn; rewrite ^(.*) www.it.com$1; # $1当访问的是www.abc.com/test的时候 $1指的就是/test } # 案例:域名镜像 # 主要实现将资源分散到不同的主机上 server { listen 80; server_name www.abc.cn; location /user { rewrite ^/user(.*)$ http://www.otherhost.cn$1; # 这里上面也讲到过,并不会影响浏览器url地址,所以部分资源我们可以用专门的电脑去处理。 } location .emp{ default_type text/plain; return 200 '<h1>emp_access</h1>'; } } # 防盗链,我们也可以通过rewrite返回一个默认图片