Nginx的URL重写模块用的很多。常用的URL重写模块命令有if,rewrite,set,break等。
一、if命令
if命令的使用方法如下:
语法:if(condition){...}
默认值:none
使用字段:server,location
默认情况下,if命令默认值为空,可以在Nginx配置文件的server,location部分使用,if命令还可以在判断语句中指定正则表达式或者匹配条件等。
正则表达式匹配:
~:表示区分大小写匹配
~*:表示不区分大小写匹配
!~和!~*分别表示区分大小写不匹配和不区分大小写不匹配
文件和目录匹配:
-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/images; } } 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/images"这三个目录下面。请求静态资源的方式是依次从这三个目录下面查找。如果第一个目录不存在的话,就去找第二个目录。以此类推,如都找不到的话,就返回404错误。
动态资源分别位于"/webdata/webapp/www/ROOT"和"/usr/local/nginx/www/jsp"两个目录下面。如果客户端请求的资源是以jsp结尾的文件,那么依次在这两个动态程序目录中查找资源。如果没有在这两个目录中定义的资源,那么将在从根目录"/var/www/html"中进行查找。
二、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变化。这个功能在新旧网站交替的时候非常有用。
三、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变量。
四、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重写的几个例子,仅供参考!