整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

Nginx URL重写规则配置详解

ewrite模块介绍

nginx的重写模块是一个简单的正则表达式匹配与一个虚拟堆叠机结合。依赖于PCRE库,因此需要安装pcre。根据相关变量重定向和选择不同的配置,从一个location跳转到另一个location,不过这样的循环最多可以执行10次,超过后nginx将返回500错误。同时,重写模块包含set指令,来创建新的变量并设其值,这在有些情景下非常有用的,如记录条件标识、传递参数到其他location、记录做了什么等等。

rewrite模块指令

break

语法:break

默认值:none

使用字段:server, location, if

作用:完成当前设置的重写规则,停止执行其他的重写规则。

if

语法:if (condition) { … }

默认值:none

使用字段:server, location

注意:尽量考虑使用trp_files代替。

判断的条件可以有以下值:

一个变量的名称:空字符传”“或者一些“0”开始的字符串为false。

字符串比较:使用=或!=运算符

正则表达式匹配:使用~(区分大小写)和~(不区分大小写),取反运算!~ 和!~。

文件是否存在:使用-f和!-f操作符

目录是否存在:使用-d和!-d操作符

文件、目录、符号链接是否存在:使用-e和!-e操作符

文件是否可执行:使用-x和!-x操作符

return

语法:return code

默认值:none

使用字段:server, location, if

停止处理并为客户端返回状态码。非标准的444状态码将关闭连接,不发送任何响应头。可以使用的状态码有:204,400,402-406,408,410, 411, 413, 416与500-504。如果状态码附带文字段落,该文本将被放置在响应主体。相反,如果状态码后面是一个URL,该URL将成为location头补值。没有状态码的URL将被视为一个302状态码。

rewrite

语法:rewrite regex replacement flag

默认值:none

使用字段:server, location, if

按照相关的正则表达式与字符串修改URI,指令按照在配置文件中出现的顺序执行。可以在重写指令后面添加标记。

注意:如果替换的字符串以http://开头,请求将被重定向,并且不再执行多余的rewrite指令。

尾部的标记(flag)可以是以下的值:

last – 停止处理重写模块指令,之后搜索location与更改后的URI匹配。

break – 完成重写指令。

redirect – 返回302临时重定向,如果替换字段用http://开头则被使用。

permanent – 返回301永久重定向。

rewrite_log

语法:rewrite_log on | off

默认值:rewrite_log off

使用字段:server, location, if

变量:无

启用时将在error log中记录notice级别的重写日志。

set

语法:set variable value

默认值:none

使用字段:server, location, if

为给定的变量设置一个特定值。

uninitialized_variable_warn

语法:uninitialized_variable_warn on|off

默认值:uninitialized_variable_warn on

使用字段:http, server, location, if

控制是否记录未初始化变量的警告信息。

重写规则组成部分

第一部分–正则表达式

可以使用括号来捕获,后续可以根据位置来将其引用,位置变量值取决于捕获正则表达式中的顺序,引用第一个括号中的值,引用第二个括号中的值,以此类推。如:

^/images/([a-z]{2})/([a-z0-9]{5})/(.*)\.(png|jpg|gif)$

# 是两个小写字母组成的字符串

# 是由小写字母和0到9的数字组成的5个字符的字符串

# 将是个文件名

# 是png、jpg、gif中的其中一个。

第二部分–URI

请求被改写。该URI可能包含正则表达式中的捕获的位置参数或这个级别下的nginx任何配置变量。如:

/data?file=.

如果这个URI不匹配nginx配置的任何location,那么将给客户端返回301(永久重定向)或302(临时重定向)的状态码来表示重定向类型。该状态码可以通过第三个参数来明确指定。

第三部分–标记

第三部分也就是尾部的标记(flag)。 last标记将导致重写后的URI搜索匹配nginx的其他location,最多可循环10次。如:

rewrite '^/images/([a-z]{2})/([a-z0-9]{5})/(.*)\.(png|jpg|gif)$' /data?file=. last;

break指令可以当做自身指令。如:

if ($bwhog) {

limit_rate 300k;

break;

}

ginx 的 rewrite 语法

语法: rewrite regex replacement flag

默认: none

作用域: server, location, if

此指令根据表达式来更改URI,或修改字符串。

指令根据配置文件中的顺序来执行。

注意:

重写表达式只对相对路径有效。如果想配对主机名,应该使用if语句。

rewrite只是会改写路径部分的东东,不会改动用户的输入参数,因此这里的if规则里面,你无需关心用户在浏览器里输入的参数,rewrite后会自动添加的,因此,只是加上了一个?号和后面我们想要的一个小小的参数 ***https=1就可以了。

nginx的rewrite规则参考:

~ 为区分大小写匹配

~* 为不区分大小写匹配

!~和!~*分别为区分大小写不匹配及不区分大小写不匹

-f和!-f用来判断是否存在文件

-d和!-d用来判断是否存在目录

-e和!-e用来判断是否存在文件或目录

-x和!-x用来判断文件是否可执行

last 相当于Apache里的[L]标记,表示完成rewrite,呵呵这应该是最常用的

break 终止匹配, 不再匹配后面的规则

redirect 返回302临时重定向 地址栏会显示跳转后的地址

permanent 返回301永久重定向 地址栏会显示跳转后的地址

$args

$content_length

$content_type

$document_root

$document_uri

$host

$http_user_agent

$http_cookie

$limit_rate

$request_body_file

$request_method

$remote_addr

$remote_port

$remote_user

$request_filename

$request_uri

$query_string

$scheme

$server_protocol

$server_addr

$server_name

$server_port

$uri

结合QeePHP的例子:

复制代码代码示例:

if (!-d $request_filename) {

rewrite ^/([a-z-A-Z]+)/([a-z-A-Z]+)/?(.*)$ /index.php?namespace=user&controller=&action=& last;

rewrite ^/([a-z-A-Z]+)/?$ /index.php?namespace=user&controller= last;

break;

多目录转成参数

复制代码代码示例:

abc.domian.com/sort/2 => abc.domian.com/index.php?act=sort&name=abc&id=2

if ($host ~* (.*)\.domain\.com) {

set $sub_name ;

rewrite ^/sort\/(\d+)\/?$ /index.php?act=sort&cid=$sub_name&id= last;

}

认IIS是不提供URL重写模块的。请注意,不要将IIS默认的HTTP重定向理解为url重写。

安装url重写模块

url重写,是要从iis的应用市场下载url重写组件才可以的。

URL重写工具的下载地址: 64位版本 32位版本

设置规则

比如我样实现访问www.demo.com/1.aspx自动跳到新地址www.demo.com/1

规则设置如下:



在配置了url重写组件的IIS中,可以直接操作web.config

如下图:

代码:

    <system.webServer>        <rewrite>            <rules>                <rule name="test" stopProcessing="true">                    <match url="shop/(.*).aspx" />                    <action type="Redirect" url="/shop/{R:1}" />                    <conditions>                    </conditions>                </rule>            </rules>        </rewrite>    </system.webServer>

动态跳转实例

那如果要加动态页面怎么办???莫慌,莫慌,看下图:原链接:http://en.amusechina.cn/en/ProductDetail-2.0.aspx?proId=1159&cateId=99现链接:http://en.amusechina.cn/product1159/99.html

三个实例

1、http重定向至https

填写内容 ->

名称:随意

模式:(.*) ;代表全部,任意,无论是否字符都匹配

条件:{HTTPS};https,模式^OFF$,代表https关闭,也就是没有;;;{HTTP_HOST}:填写要匹配的域名,不能其他的域名访问到也重定向至这个https,逻辑分组全部匹配,任意匹配是满足一个条件即可进行下面处理

操作类型:重定向

重定向URL:https://www.example.com/{R:1}

结果相当于 访问 http://www.example.com/……. 重定向至 https://www.example.com/…….

2、重写服务,一般使用为nodejs服务需要实现路径转为根节点访问,这里不写条件,一般条件使用为上面的两种,这里为了截图方便,不予展示

模式:^blog/(.*)

类型:重写

目标URL:http://127.0.0.1:3001/{R:1}

结果:访问:http://www.example.com/blog/index.html —> http://127.0.0.1:3001/inde.html

当然这个127.0.0.1指的是服务器的本地,而不是访问者电脑本地,这样使用,可以防止开发太多端口,引起安全问题

3、重写服务-文件

模式:(.*)phpf$:代表访问的文件以phpf结尾

类型:重写

目标URL:http://www.example.com/{R:1}.php

结果:访问:http://www.example.com/dir/loginphpf —> http://www.example.com/dir/login.php

这样当后端有其他语言或者不想在前端显示文件后缀时,可以使用这种方式来进行隐藏,phpf可以自己随意更改