一、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

① 准备两个网站

nginx模糊文件前缀 nginx location 模糊匹配_centos

nginx模糊文件前缀 nginx location 模糊匹配_centos_02

② 配置 redirect

location /a {

        rewrite 原URL 新URL;

}

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

nginx模糊文件前缀 nginx location 模糊匹配_nginx模糊文件前缀_03

nginx模糊文件前缀 nginx location 模糊匹配_linux_04

permanent

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

nginx模糊文件前缀 nginx location 模糊匹配_linux_05

nginx模糊文件前缀 nginx location 模糊匹配_centos_06

③ 用以下方法对 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的目录和页面)

nginx模糊文件前缀 nginx location 模糊匹配_nginx模糊文件前缀_07

③ 访问旧页面查看效果

nginx模糊文件前缀 nginx location 模糊匹配_nginx_08

查看日志记录,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;

}

访问页面查看效果:

nginx模糊文件前缀 nginx location 模糊匹配_linux_09

(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;

        }

}

配置默认页面

nginx模糊文件前缀 nginx location 模糊匹配_centos_10

配置测试页面

nginx模糊文件前缀 nginx location 模糊匹配_linux_11

② 配置地址重写:

● 方法一:

if ( $host ~* 1.com ) {

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

}

nginx模糊文件前缀 nginx location 模糊匹配_http_12

● 方法二:

location /1.com {

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

}

访问页面查看效果:

nginx模糊文件前缀 nginx location 模糊匹配_http_13

(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

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

nginx模糊文件前缀 nginx location 模糊匹配_nginx_14

② 配置地址重写:

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

访问页面查看效果:

nginx模糊文件前缀 nginx location 模糊匹配_centos_15

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

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

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

① 配置测试网页:

nginx模糊文件前缀 nginx location 模糊匹配_centos_16

② 配置地址重写:

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模糊文件前缀 nginx location 模糊匹配_linux_17

nginx模糊文件前缀 nginx location 模糊匹配_linux_18