nginx location 与 rewrite

本文详细介绍了Nginx中的location配置规则,包括精确匹配、字符开头匹配、正则表达式匹配以及优先级。同时讲解了rewrite的功能,如URL重写、伪静态化、重定向和安全应用,以及break和last标记的使用。

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

一、location

1、简介

在 Nginx中,location 通常用于配置 server block,处理特定 URI 或 URL 路径的请求,以确定请求应该由哪个块或模块处理。

2、语法规则

location [ = | ~ | ~* | !~ | !~* | ^~ ] /uri/ {

        module;

        module;

}

① 精确匹配

= 表示精确匹配。如果 URI 与 location 块中的精确匹配表达式完全相符,那么这个 location 块将被选中。精确匹配的 location 块具有最高的优先级。

② 字符开头匹配

^~  匹配以某些字符串开头的 URI

③ 正则表达式匹配

~ 区分大小写的正则匹配 ;

~* 不区分大小写的正则匹配;

!~ 非(区分大小写匹配的正则);

!~* 非(不区分大小写匹配的正则)

例:location ~ \.php$:使用正则表达式匹配以 .php 结尾的文件

④ 通用匹配

/ 表示通用匹配,如果没有与请求匹配的location块,Nginx 将使用默认的 location 块来处理请求。

3、优先级:

=  >  ^~  >  ~ | ~* | !~ | !~*  >  /

精确匹配  >  模糊开头匹配  >  整段模糊匹配  >  通用匹配

二、rewrite

1、rewrite 的概念和作用

(1) 概念:

rewrite 又叫 URL 重写,根据配置的规则,将请求的 URL 修改为新的 URL。可以用于URL重定向、修改请求路径到不同的后端服务。

(2) 作用:

① rewrite 最常见的应用是 URL 伪静态化,通过隐藏动态生成的 URL 背后的脚本和参数,让动态生成的页面看起来像静态页面的 URL。伪静态 URL 更具有可读性和记忆性,同时有助于提高网站在搜索引擎结果页面(SERP)中排名(改善SEO)

例:http://www.123.com/news/index.php?id=123 转换成 http://www.123 .com/news/123.html

② 提高安全性:伪静态 URL 可以隐藏后端脚本和数据库查询等技术细节,减少信息泄露;

③ 实现网站跳转:rewrite 可以将旧的URL重定向到新的URL

例:访问 www.360buy.com,页面跳转到 www.jd.com

2、rewrite 示例

(1) 示例一:网站内重定向

当用户访问 http://192.168.198.133/a/1.html 时,通过 redirect 重定向至 http://192.168.198.133/b/2.html

① 准备两个网站

② 配置 redirect

location /a {

        rewrite 原URL 新URL;

}

.*  表示匹配  /a  下的所有网站 ;a 文件夹存不存在并不会影响重定向的结果

permanent

在 redirect 配置中添加 permanent 参数后,nginx 会执行永久性的重定向,将旧的 URL 重定向至新的 URL,同时返回状态码 301(请求的资源已永久移动到新的 URI ,客户端更新其链接)

③ 用以下方法对 http://192.168.198.133/a/1.html 进行匹配:

● location = /a :结果不会重定向,因为 = 表示精确匹配

● location ~ /a ;location ^~ /a :模糊匹配,匹配结果会进行重定向

● 用户访问如下 URL http://192.168.100.10/cde/a/1.html 结果会被 location ~ /a 匹配重定向,若不想匹配这条 URL,可以修改匹配规则为 location ~^ /a

(2) 示例二:网站内重定向(替换 URL 中的一部分内容)

将 http://192.168.198.133/2023/a/b/1.html 换成 http://192.168.198.133/2024/a/b/1.html

① 方法:利用正则表达式的()和 \1 对 URL 进行匹配和替换

location /2023 {

        rewrite ^/2023/(.*)$ /2024/$1 permanent;

}

这段代码的作用是将所有以 /2023/ 开头的 URL 重写为以 /2024/ 开头,并保留原始 URL 中 /2023/ 后的所有内容不变。

● ^/2023/ 匹配以2023开头的字符串 ; (.*)$ 匹配任意字符直至行结束

● /2024/ 这是新的URL的固定部分,替换原始URL中的 /2023/ ;

$1: 这是捕获组的引用,它将插入 /2023/ 后的任何内容。

② 准备目标页面(不需要准备2023的目录和页面)

③ 访问旧页面查看效果

查看日志记录,URL被permanent重新改写,请求变为2次,客户端也申请了两次。

192.168.198.133 - - [21/Sep/2023:22:55:58 +0800] "GET /2023/a/b/1.html HTTP/1.1" 301 169 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0" "-"

192.168.198.133 - - [21/Sep/2023:22:55:58 +0800] "GET /2024/a/b/1.html HTTP/1.1" 200 20 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0" "-"

(3) 示例三:网站跳转(替换主机名)

将 http://www.b.com 替换成 jd.com

① 方法:

location { rewrite } 只能替换 URL 中的指定目录路径, 使用 if (){ rewrite } 可以替换主机目录下的全部内容。

② rewrite 配置

匹配主机名为 b 的 URL,重定向至 http://jd.com。配置完 rewrite 后,还需要进行 b.com 的域名解析。

if ( $host ~* b.com ) {

        rewrite .* http://jd.com;

}

访问页面查看效果:

(4) 示例四:网站跳转(替换主机名,保留后端 URL 路径)

将 http://1.com/bbb/2.html 换成 http://cloud.com/bbb/2.html

① 准备测试网站 vim /etc/nginx/conf.d/cloud.com.conf

server {

        listen 80;

        server_name cloud.com;

        location / {

                root /cloud;

                index index.html;

        }

}

配置默认页面

配置测试页面

② 配置地址重写:

● 方法一:

if ( $host ~* 1.com ) {

        rewrite  .*  http://cloud.com$request_uri ;

}

● 方法二:

location /1.com {

        rewrite  ^/1.com/(.*)$  /cloud/$1 ;

}

访问页面查看效果:

(5) 示例五:美化URL

在访问的 URL 是目录时,在URL自动添加一个“/”,保持规范性

例:http://example.com/page 重写为 http://example.com/page/

① 配置地址重写:

if (-d  $request_filename) {

        rewrite  ^(.*)([^/])$  http://$host$1$2/ permanent;

● if (-d  $request_filename):$request_filename 是存储客户端HTTP请求的文件路径。这段配置代码用于检查 $request_filename 所代表的路径是否存在且是一个目录。

● rewrite  ^(.*)([^/])$  http://$host$1$2/

这个 rewrite 语句用于重写 URL,它的作用是在 URL 末尾添加一个斜杠(/),确保 URL 以斜杠结尾:

^(.*)([^/])$ :匹配以任意字符开头且不以 / 结尾的 URL

http://$host$1$2/ :将正则表达式捕获的分组构建成新的 URL,(/) 是添加到URL 末尾的斜杠。

(6) 示例六:引用原 URL 当中的信息,重定向至目标的 URL

例:http://jack.1.com 重定向至 http://www.1.com/jack

① 准备目标页面并添加域名解析:

② 配置地址重写:

if ( $host  ~*  "^www.1.com$" ) {

        break;

}

if ( $host  ~*  "^(.*)\.1\.com$" ) {

        set $user $1;

        rewrite .* http://www.1.com/$user permanent;

}

● 设置 break:不匹配 http://www.1.com 。

● if ( $host ~* "^(.*)\.1\.com$" ):匹配 ~.1.com 的主机名

● set $user $1:变量 $user 设置为变量 $1 的值

在 Nginx 中,变量的定义和赋值使用 set 指令来完成;

$user 是自定义的 nginx 变量,$1 是正则表达式捕获组中的值,将 $1 的值赋值给 $user。

● rewrite .* http://www.1.com/$user:将匹配的 URL 重定向为 http://www.1.com/$user

访问页面查看效果:

(7) 示例七:break 和 last 标记

break 标记:在 rewrite 指令中使用 break 标记,表示请求的 URI 保持不变,且不再尝试匹配其他 rewrite 指令,用于阻止进一步的重写规则匹配。

"last" 标记:在 rewrite 指令中使用 "last" 标记,表示停止当前 rewrite 指令的处理,并匹配下一个 rewrite 规则。

① 配置测试网页:

② 配置地址重写:

location /break {

        rewrite .* /test/break.html break;

        root /usr/share/nginx/html;

}

location /last {

        rewrite .* /test/last.html last;

        root /usr/share/nginx/html;

}

location /test {

        rewrite .* /test/test.html break;

        root /usr/share/nginx/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、付费专栏及课程。

余额充值