Nginx Rewrite 功能是通过使用 rewrite 指令来实现 URL 重写和重定向。它允许你在 Nginx 服务器上修改请求的 URL,以满足特定的需求或处理不同的请求。

rewrite regex replacement [flag];
regex:是一个正则表达式,用于匹配请求的 URL。
replacement:是一个替换字符串,用于根据匹配到的内容修改 URL。
flag:可选参数,用于指定标记,例如 last、break、redirect 等
if指令
if (condition) {
    # code to be executed if the condition is true
}
=: #⽐较变量和字符串是否相等,相等时if指令认为该条件为true,反之为false。
!=: #⽐较变量和字符串是否不相等,不相等时if指令认为条件为true,反之为false。
~: #表⽰在匹配过程中区分⼤⼩写字符,(可以通过正则表达式匹配),满⾜匹配条件为真,不满⾜为假。
!~:#为区分⼤⼩写字符且匹配结果不匹配,不满⾜为真,满⾜为假。
~*: #表⽰在匹配过程中不区分⼤⼩写字符,(可以通过正则表达式匹配),满⾜匹配条件为真,不满⾜为假。
!~*: #为不区分⼤⼩字符且匹配结果不匹配,满⾜为假,不满⾜为真。
-f 和 ! -f: #判断请求的⽂件是否存在和是否不存在
-d 和 ! -d: #判断请求的⽬录是否存在和是否不存在。
-x 和 ! -x: #判断⽂件是否可执⾏和是否不可执⾏。
-e 和 ! -e: #判断请求的⽂件或⽬录是否存在和是否不存在(包括⽂件,⽬录,软链接)。
location /downloads {
    # 如果请求的 URL 包含 "archive" 关键字,则进行重定向
    if ($request_uri ~* "archive") {
        return 301 http://example.com/new-archive;
    }

    # 如果请求的 User-Agent 中包含 "bot" 关键字,则拒绝访问
    if ($http_user_agent ~* "bot") {
        return 403;
    }

    # 其他情况则正常处理请求
    # ...
}
break指令

在 Nginx 配置中,break 指令是 if 指令的一个特殊标记。它用于终止当前的 if 块内的处理,并跳出该块,不再继续执行后续的指令。break 指令的作用是中止当前 if 块,并直接返回结果。 break 指令通常在 if 块内部配合使用,它的语法如下:

if (condition) {
    # code to be executed if the condition is true
    break;
}
return指令

在 Nginx 配置中,return 指令用于在处理请求时,直接返回指定的 HTTP 状态码和响应内容,并终止后续的处理。它可以用于快速响应特定的请求,而无需继续处理其他指令。

return code [text];
rewrite指令

通过正则表达式的匹配来改变URI,可以同时存在⼀个或多个指令,按照顺序依次对URI进⾏匹配,rewrite主要是 针对⽤⼾请求的URL或者是URI做具体处理,以下是URL和URI的具体介绍。

URI(universal resource identifier):通⽤资源标识符,标识⼀个资源的路径,可以不带协议。
URL(uniform resource location):统⼀资源定位符,是⽤于在Internet中描述资源的字符串,是URI的⼦集,
主要包括传输协议(scheme)、主机(IP、端⼝号或者域名)和资源具体地址(⽬录和⽂件名)等三部分,⼀般格式为
scheme://主机名[:端⼝号][/资源路径],如:http://www.a.com:8080/path/file/index.html就是⼀个URL
路径,URL必须带访问协议。
每个URL都是⼀个URI,

利⽤nginx的rewrite的指令,可以实现url的重新跳转,rewrtie有四种不同的flag,分别是redirect(临时重定向)、 permanent(永久重定向)、break和last。其中前两种是跳转型的flag,后两种是代理型,跳转型是指有客⼾端浏览 器重新对新地址进⾏请求,代理型是在WEB服务器内部实现跳转的。

redirect;
#临时重定向,重写完成后以临时重定向⽅式直接返回重写后⽣成的新URL给客⼾端,由客⼾端重新发起请求;使⽤相对
路径,或者http://或https://开头,状态码:302
permanent;
#重写完成后以永久重定向⽅式直接返回重写后⽣成的新URL给客⼾端,由客⼾端重新发起请求,状态码:301
last;
#重写完成后停⽌对当前URI在当前location中后续的其它重写操作,⽽后对新的URL启动新⼀轮重写检查,不建议在
location中使⽤
break;
#重写完成后停⽌对当前URL在当前location中后续的其它重写操作,⽽后直接将匹配结果返还给客⼾端即结束循环并
返回数据给客⼾端,建议在location中使⽤

redirect(临时重定向):

redirect 标记用于执行临时重定向,即返回一个 302 Found 的状态码,并将请求重定向到新的 URL。这意味着客户端浏览器会重新发起对新地址的请求。使用 redirect 标记时,新地址的 URL 将显示在浏览器地址栏中。

rewrite ^/old-url/(.*)$ /new-url/$1 redirect;

permanent(永久重定向): permanent 标记用于执行永久重定向,即返回一个 301 Moved Permanently 的状态码,并将请求重定向到新的 URL。这表示客户端浏览器会缓存新地址,并在后续请求中直接访问新地址。使用 permanent 标记时,新地址的 URL 也会显示在浏览器地址栏中。

rewrite ^/old-url/(.*)$ /new-url/$1 permanent;

break: break 标记用于中止当前的 rewrite 处理,不再继续执行后续的 rewrite 或其他指令。这意味着在使用 break 标记时,后续的规则将不会再被匹配。它通常用于中止复杂的 rewrite 规则集。

rewrite ^/url/(.*)$ /new-url/$1 break;

last: last 标记用于终止当前的 rewrite 处理,并重新启动新的请求处理。这意味着 Nginx 会尝试使用重写后的 URL 再次寻找匹配的 location 块,并继续处理请求。

rewrite ^/old-url/(.*)$ /new-url/$1 last;

image.png

或者使用
if ($scheme = http ){ #未加条件判断,会导致死循环
rewrite / https://www.lgw.com permanent;
}

如果是因为规则匹配问题导致的陷⼊死循环,则报错如下:显示重定向次数过多。

Nginx防盗链

防盗链是一种常见的安全措施,用于限制资源只能被特定来源(合法的网站或域名)访问,防止资源被未授权的第三方盗用。在 Nginx 中,可以通过配置 valid_referers 指令来实现防盗链。

server {
    listen 80;
    server_name yourdomain.com;

    location /protected {
        # 设置防盗链规则,允许来自白名单的来源
        valid_referers none blocked yourdomain.com ~\.google\. ~\.bing\.;

        # 配置防盗链返回的错误页面
        if ($invalid_referer) {
            return 403;
        }

        # 设置防盗链返回的错误页面(可选方式)
        # error_page 403 /403.html;

        # 其他处理逻辑
        # ...
    }

    # 其他配置
    # ...
}
#在上述配置中,我们假设要防盗链的资源在 /protected 目录下。valid_referers 指令用于指定允许访问资源的来源列表。在这个例子中,我们设置了 valid_referers 为 none blocked yourdomain.com,其中:
none:表示不允许任何来源访问资源。
blocked:表示允许来自黑名单的来源访问资源(Nginx 黑名单模块需要在编译时启用)。
yourdomain.com:表示允许来自 yourdomain.com 域名的请求访问资源。

image.png