Nginx的URL Rewrite基本指令

1、Nginx Rewrite规则相关指令:

功能:实现URL的重写,通过Rewrite规则,可以实现规范的URL,根据变量来做URL转向及选择配置。

作用范围:server{},location{},if{}

优先级:

执行server块的rewrite指令 > 执行location匹配 >执行选定的location中的rewrite指令。

Nginx Rewrite规则相关指令有if、rewrite、set、return、break等,其中Rewrite是最关键的指令。

1.1)break指令

语法:break

默认值:none

使用环境:server,location,if

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

eg:

if (slow) {
limit_rate 20k;
break;
}

1.2)if指令

语法:if(condition){...}

默认值:none

使用环境:server,location

作用:该指令用于检测一个条件是否符合,如果条件符合,则执行大括号内的语句。if指令不支持嵌套,不支持多个条件&&和||处理。

以下信息可以被指定为条件:

(1)变量名,错误的值包括:空字符串“”,或者任何以0开始的字符串。

(2)变量比较可以使用“=”和“!=”(等于和不等于)运算符

(3)正则表达式模式匹配可以使用“~”和“~*”符号

(4)~  为区分大小写匹配 

(5)~* 为不区分大小写匹配 

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

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

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

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

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

wKiom1icMlSgfEqtAACJSWtXQTs817.png

1.3)return指定:

语法:return code

默认值:none

使用环境:server,location,if

作用:该指令用于结束规则的执行并返回状态码给客户端。状态码可以使用这些值:204、400、402-406、408、410、411、413、416、500-504.此外,非标准状态码444将以不发送任何Header头的方式结束连接:

eg:访问URL以.sh和。bash结束,返回状态码403.

location `.*\.(sh|bash)?$
{
return 403;
}

1.4)rewrite指令:

语法: rewrite regex replacement flag

默认值:none

使用环境:server,location,if

作用:该指令根据变大时来重定向URL,或者修改字符串,指令根据配置文件中的顺序来执行。

Rewrite指令的最后一下参数为flag标记,支持的flag标记有:

last 相当于Apache里的[L]标记,表示完成rewrite

break 本条规则匹配完成之后,终止匹配,不再匹配后面的规则。

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

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

1.5)set指令:

语法:set variable value

默认值:none

使用环境:server,location,if

作用:该指令用于定义一个变量,并给变量赋值,变量的值可以为文本,变量及文本变量的联合。

eg:set $varname 'hello'

1.6) uninitalized_variable_warn指令:

语法:unitialized_variable_warn onloff

默认值:unitialized_variable_warn on

使用环境:http、server、location、if

作用:该指令用于开启或者关闭未初始化变量的警告信息,默认值为开启。

1.7)Nginx Rewrite可以用到的全局变量:

$args : #这个变量等于请求行中的参数,同$query_string

$content_length : 请求头中的Content-length字段。

$content_type : 请求头中的Content-Type字段。

$document_root : 当前请求在root指令中指定的值。

$host : 请求主机头字段,否则为服务器名称。

$http_user_agent : 客户端agent信息

$http_cookie : 客户端cookie信息

$limit_rate : 这个变量可以限制连接速率。

$request_method : 客户端请求的动作,通常为GET或POST。

$remote_addr : 客户端的IP地址。

$remote_port : 客户端的端口。

$remote_user : 已经经过Auth Basic Module验证的用户名。

$request_filename : 当前请求的文件路径,由root或alias指令与URI请求生成。

$scheme : HTTP方法(如http,https)。

$server_protocol : 请求使用的协议,通常是HTTP/1.0或HTTP/1.1。

$server_addr : 服务器地址,在完成一次系统调用后可以确定这个值。

$server_name : 服务器名称。

$server_port : 请求到达服务器的端口号。

$request_uri : 包含请求参数的原始URI,不包含主机名,如:”/foo/bar.php?arg=baz”。

$uri : 不带请求参数的当前URI,$uri不包含主机名,如”/foo/bar.html”。

$document_uri : 与$uri相同。


### 用法 `rewrite` 指令Nginx 中用于重写 URL 的强大工具。它可以将请求的 URL 重写为另一个 URL,从而实现 URL 转发、重定向等功能。 #### 基本语法 `rewrite` 指令基本语法如下: ```nginx rewrite regex replacement [flag]; ``` - `regex`:正则表达式,用于匹配请求的 URL。 - `replacement`:替换后的 URL。 - `flag`:可选标志,用于控制重写行为。常见的标志有: - `last`:停止当前的 `rewrite` 规则集,开始下一个阶段的处理。 - `break`:停止当前的 `rewrite` 规则集,不再进行后续的 `rewrite` 处理。 - `redirect`:返回临时重定向(HTTP 302)。 - `permanent`:返回永久重定向(HTTP 301)。 #### 示例 以下是一些常见的 `rewrite` 指令用法和示例: 1. **内部重写** ```nginx rewrite ^/old-path/(.*)$ /new-path/$1 break; ``` 这条指令会将 `/old-path/` 后面的部分重写为 `/new-path/` 后面的部分,并且不会触发浏览器的重定向。 2. **临时重定向** ```nginx rewrite ^/old-path/(.*)$ http://example.com/new-path/$1 redirect; ``` 这条指令会将 `/old-path/` 后面的部分重定向到 `http://example.com/new-path/` 后面的部分,并且返回 HTTP 302 状态码。 3. **永久重定向** ```nginx rewrite ^/old-path/(.*)$ http://example.com/new-path/$1 permanent; ``` 这条指令会将 `/old-path/` 后面的部分重定向到 `http://example.com/new-path/` 后面的部分,并且返回 HTTP 301 状态码。 4. **基于条件的重写** ```nginx if ($http_user_agent ~* (msie|MSIE)) { rewrite ^/welcome\.html$ /ie-welcome.html redirect; } ``` 这条指令会在用户使用 Internet Explorer 浏览器时,将 `/welcome.html` 重定向到 `/ie-welcome.html`。 ### 执行顺序 `rewrite` 指令的执行顺序如下: 1. 执行 `server` 块的 `rewrite` 指令。 2. 执行 `location` 匹配。 3. 执行选定的 `location` 中的 `rewrite` 指令。 如果其中某步 URI 被重写,则重新循环执行 1-3,直到找到真实存在的文件。如果循环超过 10 次,则返回 500 Internal Server Error 错误 [^3]。 ### 配置示例 以下是一个简单的配置示例: ```nginx server { listen 80; server_name example.com; location /search/ { if ($remote_addr = "192.168.184.1") { return 200 "test if OK in URL /search/"; } } location / { if ($uri = "/images") { rewrite (.*) /pics/ break; } } } ``` 在这个配置中,如果客户端的 IP 地址是 `192.168.184.1`,并且请求的 URL 是 `/search/`,则会返回 "test if OK in URL /search/"。如果请求的 URL 是 `/images`,则会被重写为 `/pics/` [^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值