NginxURL重写应用

nginx的URL重写模块是用得比较多的模块之一,所以我们需要好好地掌握运用。常用的URL重写模块命令有if,rewrite,set,break等。

  1. if命令

if用于判断一个条件,如果条件成考,则执行后面大括号内的语句,相关配置从上级继承。if命令的使用方法如下:

语法:if(condition) {….}                                                                      # condition:条件

默认值:none

使用字段:server,location

默认情况下,if命令值为null,可在Nginx配置文件的server,location部分使用,另外,

if命令可以在判断语句中指定正则表达式或匹配条件,相关匹配条件如下:

正则表达式匹配:

  • ~表示区分大小写匹配
  • ~*表示不区分大小写匹配
  • !~和!~*表示上面2种不匹配

文件及目录匹配:

  • -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_post:此变量表示客户端端口。
  • $remote_user:此变量等同于用户名。由 ngx_http_auth_basic_module模块认证。
  • $request_filename:此变量表示当前请求的文件的路径名,由root或alias与URI request组合而成。
  • $request_uri:此变量表示含有参数的完整的初始URI。
  • $query_string:此变量与$args含义一致。
  • $server_name:此变量表示请求到达的服务器名。
  • $server_port:此变量表示请求请求到达的服务器端口号。

在了解相关的if命令规则和Nginx内置变量后,下面给出一个server配置段实例:

server {

listen       80;

server_name  www.gxl.com;

location / {

root   html;

index  index.html index.htm index.php;

}

location ~ \.(gif|jpg|jpeg|png|bmp|swf)$ {

root           html;

expires 30d;

if ( !-f $request_filename )

{

root /var/www/html

}

if ( !-f $request_filename )

{

root /emp

}

}

location ~ \.(jsp|jspx|do)$ {

root html;

proxy_set_header Host $host;

proxy_set_header X-Forwarded-For $remote_addr;

proxy_pass http://127.0.0.1:8080;

if ( !-f $request_filename )

{

root /var/www/html

}

}

}

当我们访问以gif结尾的文件的时候,我们先在root定义的目录下查找,然后再在下面依次的目录查找。

  1. 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之后搜索相应的URL或location。

break:表示终止匹配,不在匹配后面的规则。

redirect:将返回302临时重定向,在浏览器地址栏会显示跳转后的URL地址。

permanent:将返回301永久重定向,在浏览器地址栏会显示跳转后的URL地址。

其中,last和break用来实现URL重写,浏览器地址栏中的URL地址不变。下面是一个示例配置:

location ~ ^/best/ {

rewrite ^/best/(.*)$ /test/$1 break;

proxy_pass http://www.fjp.com;

}

这个例子使用了break标记,可以实现将请求http://www.gxl.com/best/index.html的页面重定向到http://www.fjp.com/test/index.html页面,而不引起浏览器地址栏中URL的变化。这个功能在新旧网站交替的时候非常有用。

  1. set命令

通过set命令可以设置一个变量并为其赋值,其值可以是文本,变量,或他们的组合。也可以使用set定义一个新的变量,但是不能使用set设置$http_xxx头部的值。

set使用语法如下:

语法:set variable value

默认值:none

使用字段:server,location,if

在默认情况下,set命令默认值为空,可在nginx配置文件的server,location,if部分使用,下面是一个示例配置:

location / {

root   html;

index  index.html index.htm index.php;

proxy_cache cache_one;

proxy_cache_valid 200 304 12h;

proxy_cache_key $host$uri$is_args$args;

#     proxy_pass http://127.0.0.1:8080;

set $query $query_string;

rewrite /dede /wordpress?$query?;

}

在这个例子中,要实现将请求为http://www.tb.com/dede/?p=160的页面重写到地址http://www.tb.com/wordpress/?p=160,也就是重写带参数的URL。这里涉及$query_string变量,这个变量相当于请求行中的参数,也就是?后面的内容,也可以用$args代替$query_string变量。

  1. breadk命令

break的用法在前面的介绍中其实已经出现过,他表示完成当前设置的规则后,不再匹配后面的重写规则。break的使用语法如下:

语法:break

默认值:none

使用字段:server,location,if

在默认情况下,break命令的值为空,可在nginx配置文件的server,location,if部分使用,下面事一个应用实例:

server {

listen       80;

server_name  www.gxl.com www.fjp.com;

if ( $host != 'www.fjp.com' ) {

rewrite ^/(.*)$ http://www.fjp.com/error.txt break;

rewrite ^/(.*)$ http://www.fjp.com/$1 permanent;

}

}

这个例子中定义了两个域名,当通过www.gxl.com访问网站时,会将请求重定向到http://www.fjp.com/error.tx页面,而通过www.fjp.com能够正常访问,而且由于上一句设置了break命令,因此下面的rewrite规则不在执行,直接退出。

4.Nginx的URL重写应用的更多相关文章

  1. nginx的URL重写应用实例

    1,NGINx的URL重写 NGINX 的URL重写模块用的比较多,主要使用的命令有if rewrite set break 2 if命令 语法如下"" 语法:if(conditi ...

  2. Nginx实现URL重写

    本文利用Nginx实现URL重写,本文使用Nginx与静态页面配合重写URL. 1.准备工作. 结合本文场景,需要安装Nginx. 1.1 关于Linux系统安装Nginx可以参考我的文章---(传送 ...

  3. nginx配置url重写

    url重写是指通过配置conf文件,以让网站的url中达到某种状态时则定向/跳转到某个规则,比如常见的伪静态.301重定向.浏览器定向等 rewrite 语法 在配置文件的server块中写,如: s ...

  4. nginx的url重写

    1.1 简介 url重写由ngx_http_rewrite_module模块提供,默认会安装,但该模块功能的实现需要pcre.URL重写技术不仅要求掌握几个指令的语法.熟悉简单的正则表达式,还需要尽量 ...

  5. Nginx之URL重写(rewrite)配置

    Nginx URL重写(rewrite)配置及信息详解1)if判断指令 语法为if(condition){…}     #对给定的条件condition进行判断.如果为真,大括号内的rewrite指令 ...

  6. nginx的url重写[rewrite规则和参考]

    本日志内容来自互联网和平日使用经验,整理一下方便日后参考. Nginx Rewrite 相关指令有 if.rewrite.set.return 等. if 的语法 应用于 server 和 locat ...

  7. lnmp配置支持thinkphp和nginx路由url重写

    ThinkPHP3.2.3项目放到lnmp环境之后只能打开首页,或者通过传参方式打开控制器,否则就一直显示404页面.搞了一上午,终于解决了 step1: 修改php.ini cgi.fix_path ...

  8. nginx-url重写

    location /game_web{ if (!-e $request_filename){//请求不是文件或者目录 rewrite ^/game_web/(\/init/$ last; break ...

  9. Nginx 反向代理、负载均衡、页面缓存、URL重写及读写分离详解

    转载:http://freeloda.blog.51cto.com/2033581/1288553 大纲 一.前言 二.环境准备 三.安装与配置Nginx 四.Nginx之反向代理 五.Nginx之负 ...

随机推荐

  1. 关于mysql插入数据异常

    今天创建数据库时,在插入数据时出现了几个问题.(首次在LInux环境下创建数据库) 一个是关于SQL Error [1146] [42S02]: Table 'struts2exec.s_user' ...

  2. 【转】Nginx反向代理和负载均衡

    原文链接:http://www.cnblogs.com/shuoer/p/7820899.html Nginx反向代理和负载均衡 环境说明 由于我使用的是windows系统,所以我用虚拟机虚拟出来了3 ...

  3. 如何在Windows下用cpu模式跑通py-faster-rcnn 的demo.py

    关键字:Windows.cpu模式.Python.faster-rcnn.demo.py 声明:本篇blog暂时未经二次实践验证,主要以本人第一次配置过程的经验写成.计划在7月底回家去电脑城借台机子试 ...

  4. PHP魔术方法和魔术变量总结

    从php5以后的版本,类就可以使用魔术方法了.PHP规定以两个下划线开头的方法都保留为魔术方法,所以建议大家函数名最好不用__开 头,除非是为了重载已有的魔术方法. 目前php已有的魔术方法有 __c ...

  5. ibv_open_device()函数

    struct ibv_context *ibv_open_device(struct ibv_device *device); 描述 函数会创建一个RDMA设备相关的context:可以通过ibv_c ...

  6. Python 开发与接口测试学习笔记

    这是我跟着虫师学习中积累下来的学习笔记,写得比较简单,适合想学习Python开发与接口测试的初学者学习. 一.开发投票系统 1.参考官网文档,创建投票系统. https://docs.djangopr ...

  7. 一个js的动画,以前以为只有flash可以实现

    11年刚干这行的时候,看到这种什么百叶窗的动画,以为都是flash实现的,最近突然灵光一闪,想到了用js实现(虽然我不是做前端的,本人做.net).代码虽然实现了,但是比较乱,先上个图: 代码主要就是 ...

  8. CORS预检请求详谈

    引言 最近在项目中因前后端部署不同地方,前端在请求后端api时发生了跨域请求,我们采用CORS(跨域资源共享)来解决跨域请求,这需要前后端的配合来完成.在这一过程中,后端支持了CORS跨域请求后,前端 ...

  9. 从源代码到Runtime发生的重排序

     源代码和Runtime时执行的代码很可能不一样,这是因为编译器.处理器常常会为了追求性能对改变执行顺序.然而改变顺序执行很危险,很有可能使得运行结果和预想的不一样,特别是当重排序共享变量时.  从源 ...

  10. 错误代码: 1054 Unknown column 't.createUsrId' in 'group statement'

    1.错误描写叙述 1 queries executed, 0 success, 1 errors, 0 warnings 查询:select count(t.id),t.`createUserId` ...