一、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;
}
访问页面查看效果: