配置Nginx的Rewrite-------(rewrite语法、location相关知识、访问跳转)

本文详细介绍Nginx Rewrite模块的使用方法,包括URL重写、条件判断、域名及参数跳转等实战案例,帮助读者掌握Nginx高级配置技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、Nginx Rewrite概述

1.1 Rewrite跳转场景

URL看起来更规范、合理

企业会将动态url地址伪装成静态地址提供服务

网址换新域名后,让旧的访问跳转到新的域名上

服务端某些业务调整

1.2 Rewrite跳转实现

nginx-----支持url重写、支持if条件判断,但不支持else
跳转------循环最多可以执行10次,超过后nginx将返回500代码错误
rewrite------使用nginx’全局变量或自己设置的变量,结合正则表达式和标志位实现url重写以及重定向

1.3 Rewrite实际场景

nginx跳转需求的实现方式
●使用rewrite进行匹配跳转
●使用if匹配全局变量后跳转
●使用location匹配再跳转

■rewrite放在 server{},if{},location{}段中

对域名或参数字符串
●使用if全局变量匹配
●使用proxy_pass反向代理

三、location分类

3.1 分类

location = patt {} [精准匹配]
location = patt {} [一般匹配]
●location = patt {} [正则匹配]

3.2 location优先级

■相同类型的表达式,字符串长的会优先匹配

■按优先级排列
●= 类型
●^~ 类型表达式
●正则表达式(和*)类型
●常规字符串匹配类型,按前缀匹配
●通用匹配(/),如果没有其他匹配,任何请求都会匹配到

■location优先级的示例

3.3 location优先级规则

■匹配某个具体文件
●(location = 完整路径)> (location ^~ 完整路径)> (location ~* 完整路径) > (location ~ 完整路径) > (location 完整路径) > (location /)

■用目录做匹配访问某个文件
●(location = 目录)> (location ^~ 目录/)> (location ~ 目录) > (location ~* 目录) > (location 目录) > (location /)

3.4 比较rewrite 和location

相同点:都能实现跳转

■不同点:
●rewrite是在同一域名内更改获取资源的路径
●location是对一类路径做控制访问或反向代理,还可以proxy_pass到其他机器

■rewrite会写在location里,执行顺序
●执行server块里面的rewrite指令
●执行location匹配
●执行选定的location中的rewrite指令

四、应用场景测试

4.1 基于域名的跳转

公司旧域名www.51xit.top,因业务需求有变更,需要使用新域名www.52xit.top代替
●不能废除旧域名
●从旧域名跳转到新域名,且保持其参数不变
■在windows里的hosts文件中做映射关系
在这里插入图片描述

#先另起一台服务器20.0.0.12,做一个测试网页
[root@www ~]# vi /usr/local/nginx/html/index.html
<html>
<head>
<p><em>这是一个测试网页!</em></p>
</body>
</html>
#再开一台20.0.0.11,修改配置
[root@www ~]# vi /usr/local/nginx/conf/nginx.conf
 location / {
          root   html;
            index  index.html index.htm;
        if ($host = 'www.51xit.top') {
        rewrite ^/(.*)$ http://www.52xit.top/$1 permanent;
        }
        }
[root@www ~]# killall -s HUP nginx   #重启

■打开windows浏览器,输入www.51xit.top,会跳到www.52xit.top上
在这里插入图片描述

4.2 基于客户端IP访问跳转

■今天公司业务版本上线,所有IP访问任何内容都显示一个固定维护页面,只有公司IP(192.168.100.1)访问正常

[root@www ~]# vim /usr/local/nginx/conf/nginx.conf
...
    server {
        listen       80;
        server_name  www.51xit.top;    #改域名
        charset utf-8;               #改字符集
        access_log  /usr/local/nginx/logs/www.51xit.top.access.log;  #改日志存储路径 去掉main
        set $rewrite true;   #设置是否合法的IP标志
       
        if ($remote_addr = "192.168.100.1"){   #改客户机的IP地址
                set $rewrite false;
        }
        if ($rewrite = true){
                rewrite (.*) /wh.html;  #跳转到wh.html
        }
        
        location = /wh.html {
                root /usr/local/nginx/html;  ##存放路径
        }
        
        location / {
           root html;
           index index.html index.htm;
       }
[root@www ~]# killall -s HUP nginx   #重启
[root@www ~]# echo "网页维护中,请联系管理员" >/usr/local/nginx/html/wh.html

■测试,打开windows浏览器(192.168.100.1),输入192.168.100.20,正常访问;登录客户机192.168.100.100,浏览器输入www.51xit.top,提示"网页维护中,请联系管理员"

4.3 基于旧,新域名的跳转

■现在访问的是http://www.51xit.top/post/,现在需要将这个域名下面的发帖都跳转到http://www.52xit.top/bbs,注意保持域名跳转后的参数不变

[root@www ~]# vim /usr/local/nginx/conf/nginx.conf
...
    server {
        listen       80;
        server_name  www.51xit.top;    #改域名
        charset utf-8;               #改字符集
        access_log  /usr/local/nginx/logs/www.51xit.top.access.log;  #改日志存储路径 去掉main
         localtion /post {	
                rewrite (.+) http://www.52xit.top/bbs$1 permanent;
        }
[root@www ~]# killall -s HUP nginx   #重启

■测试,输入www.51xit.top/post,显示www.52xit.top/bbs

4.4 基于参数匹配的跳转

■例如现在访问http://www.51xit.top/100-(100|200)-100.html跳转到http://www.51xit.top页面

[root@www ~]# vim /usr/local/nginx/conf/nginx.conf
...
    server {
        listen       80;
        server_name  www.51xit.top;    #改域名
        charset utf-8;               #改字符集
        access_log  /usr/local/nginx/logs/www.51xit.top.access.log;  #改日志存储路径 去掉main
   if ($request_uri ~ ^/100-(100|200)-(\d+).html$){
                rewrite (.*) http://www.51xit.top permanent;
        }     
[root@www ~]# killall -s HUP nginx   #重启        

■测试:浏览器输入http://www.51xit.top/100-100-100.html ,页面显示http://www.51xit.top
浏览器输入http://www.51xit.top/100-200-10.html ,页面显示http://www.51xit.top
浏览器输入http://www.51xit.top/100-100-100dddd.html ,页面不能跳转

4.5 基于最普通URL请求的跳转

■访问一个具体的页面跳转到首页

[root@www ~]# vim /usr/local/nginx/conf/nginx.conf
...
    server {
        listen       80;
        server_name  www.51xit.top;    #改域名
        charset utf-8;               #改字符集
        access_log  /usr/local/nginx/logs/www.51xit.top.access.log;  #改日志存储路径 去掉main
  location ~* ^/1/test.html {
                rewrite (.+) http://www.51xit.top permanent;
        }    
 [root@www ~]# killall -s HUP nginx   #重启    

■测试:浏览器输入http://www.51xit.top/1/test.html ,页面显示http://www.51xit.top

4.6 访问任意一个页面跳转到首页,即http://www.51xit.top/upload/1.php

[root@www ~]# vim /usr/local/nginx/conf/nginx.conf
...
    server {
        listen       80;
        server_name  www.51xit.top;    #改域名
        charset utf-8;               #改字符集
        access_log  /usr/local/nginx/logs/www.51xit.top.access.log;  #改日志存储路径 去掉main
  location ~* /upload/.*\.php$ {
                rewrite (.+) http://www.51xit.top permanent;
        }    
 [root@www ~]# killall -s HUP nginx   #重启    

■测试:浏览器输入http://www.51xit.top/upload/1.php ,页面显示http://www.51xit.top
浏览器输入http://www.51xit.top/upload/bbs/1.php ,页面显示http://www.51xit.top
浏览器输入http://www.51xit.top/upload/index.html ,页面不跳转

### Nginx 中 `location` 块内 `rewrite` 指令的用法 在 Nginx 配置中,`rewrite` 指令常用于 URL 重写或跳转逻辑。它可以在 `server` 和 `location` 块中使用,主要用于动态修改请求路径或将用户引导到不同的资源地址[^1]。 #### 1. **基本语法** `rewrite` 指令的基本形式如下: ```nginx rewrite regex replacement [flag]; ``` - `regex`: 正则表达式,用来匹配请求 URI。 - `replacement`: 替换后的目标路径或 URL。 - `[flag]`: 可选标志位,决定重写的动作模式(如立即停止后续规则、返回状态码等)。常见的标志有: - `last`: 结束当前 `rewrite` 流程并进入新的查找阶段。 - `break`: 终止所有 `rewrite` 规则,不再继续处理。 - `redirect`: 返回临时重定向 (HTTP 状态码 302)- `permanent`: 返回永久重定向 (HTTP 状态码 301)[^2]。 --- #### 2. **示例配置** ##### 示例 1:基于参数匹配的跳转 假设需求为访问形如 `http://www.xjj.com/100-(100|200)-\d+.html` 的链接时,统一跳转到根目录页面 `http://www.xjj.com`。 以下是完整的配置代码: ```nginx server { listen 80; server_name www.xjj.com; # 定义 locationlocation / { # 使用正则匹配请求 URI if ($request_uri ~* ^/100-(100|200)-(\d+)\.html$) { # 执行重定向操作 rewrite ^(.*)$ http://www.xjj.com permanent; } root html; index index.html index.htm; } } ``` 在此案例中,`if` 判断语句配合正则表达式实现了对特定 URL 的识别,而 `rewrite` 指令完成了永久重定向的功能[^2]。 --- ##### 示例 2:内部路径转换 有时需要将外部可见的 URL 转换成服务器内部的实际文件路径。例如,当用户访问 `/article/id` 时,实际加载的内容来自 `/articles/id/index.html`。 配置如下: ```nginx server { listen 80; server_name example.com; location /article/ { # 将 /article/<id> 映射为 /articles/<id>/index.html rewrite ^/article/(.*)$ /articles/$1/index.html last; } location /articles/ { root /var/www/html; } } ``` 这里的关键在于 `rewrite` 指令通过替换规则改变了请求路径,并结合 `last` 标志确保新路径能够被正确解析[^1]。 --- ##### 示例 3:带查询参数的重写 对于包含查询字符串的 URL,可能需要提取其中的部分作为新路径的一部分。例如,将 `/search?q=query_string` 转换为 `/results/query_string`。 配置如下: ```nginx server { listen 80; server_name search.example.com; location /search { # 提取 q 参数值并拼接到新路径中 if ($args ~* q=([^&]+)) { set $query $1; rewrite ^.*$ /results/$query? break; } } location /results/ { root /var/www/search; } } ``` 在这个例子中,`set` 指令辅助提取了查询参数,随后由 `rewrite` 实现了路径重构[^2]。 --- #### 3. **注意事项** - 当多个 `rewrite` 规则共存时,需注意其执行顺序以及是否会产生循环调用问题。 - 若涉及敏感数据传输,应优先考虑 HTTPS 协议以保障信息安全。 - 对于复杂的 URL 改造场景,推荐先测试单条规则再逐步扩展整体结构。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值