Nginx的URL重写模块用的不少。经常使用的URL重写模块命令有if,rewrite,set,break等。
css
1、if命令html
if命令的使用方法以下:nginx
语法:if(condition){...}web
默认值:none正则表达式
使用字段:server,location浏览器
默认状况下,if命令默认值为空,能够在Nginx配置文件的server,location部分使用,if命令还能够在判断语句中指定正则表达式或者匹配条件等。bash
正则表达式匹配:服务器
~:表示区分大小写匹配app
~*:表示不区分大小写匹配webapp
!~和!~*分别表示区分大小写不匹配和不区分大小写不匹配
文件和目录匹配:
-f和!-f用来判断是否存在文件
-d和!-d用来判断是否存在目录
-e和!-e用来判断是否存在文件或目录
-x和!-x用来判断文件是否可执行
Nginx的配置文件中有不少内存变量,这里变量能够和if命令一块儿用。常见的变量有以下几种:
$args:此变量与请求行中的参数相等
$document_root:等同于当前请求的root命令指定的值
$uri:等同于当前request中的URI
$document_uri:与$uri同样
$host:与请求头部中的“Host”行指定的值同样
$limit_rate:用来设置限制链接的速率
$request_method:等同于request的method。通常是“GET”或"POST"
$remote_addr:表示客户端IP地址
$remote_port:表示客户端端口
$remote_user:表示用户名,由ngx_http_auth_basic_module认证
$request_filename:表示当前请求的文件路径名,由root或alais与URI request组成
$request_uri:表示含含有参数的完整初始URI
$request_string:与$args同样
$server_name:请求到达的服务器名
$server_port:请求到达的服务器端口号
了解相关的if命令规则和Nginx的内在变量后,下面是一个server配置段例子:
server { listen 80; server_name www.a.com; access_log logs/host.access.log main; location / { root /var/www/html; index index.html index.htm; } location ~.*\(htm|html|gif|jpg|jpeg|png|bmp|swf|js|css)$ { root /usr/local/nginx/www/img; if (! -f $request_filename) { root /var/www/html/img; } if (! -f $request_filename) { root /apps/p_w_picpaths; } } location ~.*\. (jsp)${ root /webdata/webapp/www/ROOT; if (! -f $request_filename) { root /usr/local/nginx/www/jsp; } proxy_pass http://127.0.0.1:8888; } }
这段代码主要完成对www.a.com这个域名的资源访问设置。www.a.com这个域名的根目录为"/var/www/html"。
静态资源分别位于"/usr/local/nginx/www/img"、"/var/www/html/img"、"/apps/p_w_picpaths"这三个目录下面。请求静态资源的方式是依次从这三个目录下面查找。若是第一个目录不存在的话,就去找第二个目录。以此类推,如都找不到的话,就返回404错误。
动态资源分别位于"/webdata/webapp/www/ROOT"和"/usr/local/nginx/www/jsp"两个目录下面。若是客户端请求的资源是以jsp结尾的文件,那么依次在这两个动态程序目录中查找资源。若是没有在这两个目录中定义的资源,那么将在从根目录"/var/www/html"中进行查找。
2、rewrite命令
Nginx是经过ngx_http_rewrite_module模块支持URL重写和if条件判断的,若是要使用rewrite功能,须要pcre的支持。因此咱们在编译安装Nginx的时候,记得要指定pcre源码的安装目录。
rewrite的使用方法以下:
语法:rewrite regex flag
默认值:none
使用字段:server location if
默认状况下,rewrite命令值是空的,能够在Nginx配置文件的server location if部分使用。rewrite的命令最后一个参数为flag标记。支持的flag标记主要有如下几种:
last :至关于Apache里面的[L]标记,表示完成rewrite以后搜索相应的URI或location
break:表示终止匹配,再也不匹配后面的规则
redirect:将返回302临时重定向,在浏览器地址会显示跳转后的URL地址
permanent:将返回301永久重定向,在浏览器地址会显示跳转后的URL地址
其中,last和break用来实现URL重写,浏览器地址栏中的URL地址不变,下面是一个实例配置:
location ~ ^/best/ { rewrite ^/best/(.*) /test/$1 break; proxy_pass http://www.a.com; }
这个例子用了break标记,能够实现将请求http://www.a.com/best/webinfo.html的页面重定向到
http://www.b.com/test/webinfo.html页面而不引发浏览器地址栏中的URL变化。这个功能在新旧网站交替的时候很是有用。
3、set命令
经过set命令能够设置一个变量而且为其赋值。值能够为文本,变量或它们的组合。也可使用set定义一个新的变量,可是不能使用set设置$http_xxx头部变量的值。
set的使用方法以下:
语法:set variable value
默认值:none
使用字段:server location if
默认状况下,set命令默认值是空的,能够在Nginx配置文件的server location if部分使用,下面是一个配置例子:
location / { proxy_pass http://127.0.0.1:8080/; set $query $query_string; rewrite /dede /wordpress?$query?; }
这个例子,要实现请求为http://www.a.com/wp/?p=160的页面重写到地址http://www.b.com/wordpress/?p=160 也就是重写带参数的URL。这里涉及$query_string变量。这个变量至关于请求行中的参数,也就是"?"后面的内容。也能够用$args代替$query_string变量。
4、break命令
break表示完成当前的设置规则后,再也不匹配后面的重写规则。
break的使用方法以下:
语法:break
默认值:none
使用字段:server location if
在默认状况下,break的命令值也是空的。能够在Nginx的配置文件的server location if部分使用。下面是一个配置实例:
server { listen 80; server_name www.a.com www.b.com; if ($host != ‘www.a.com’) { rewrite ^/(.*)$ http://www.a.com/error.txt; break; rewrite ^/(.*)$ http://www.a.com/$1 permanent; } }
这个例子定义了两个域名www.a.com和www.b.com 当经过域名www.a.com访问网站时,会将请求重定向到http://www.a.com/error.txt的页面。因为设置了break命令,因此下面的rewrite就不会再执行,直接退出!
好了,以上就是一些关于URL重写的几个例子,仅供参考!