学习Nginx(八):rewrite、if、set

​​​​​​​rewrite

用途

实现URL地址的重写与跳转。

语法

rewrite regex replacement [flag];
  • regex:用于匹配URI的正则表达式。
  • replacement:替换匹配URI的新URI。
  • flag:指定如何处理替换后的URI的标志。

标志(Flags)

  • last:停止处理当前 rewrite 指令集,重新搜索匹配URI的 location 块。
  • break:停止处理当前的 rewrite 指令集。
  • redirect:返回302临时重定向。
  • permanent:返回301永久重定向。

上下文配置

rewrite指令可以在 server、location 和 if 上下文中使用。

示例1:URL重写

将 /old-url/ 重写为 /new-url/ :

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

示例2:删除URL中的 .php 扩展名

当请求 /some-page.php 时,重定向到 /some-page :

location / {  
    if ($request_filename !-f) {  
        rewrite ^(.+)\.php(.*)$ $1$2 permanent;  
    }  
}


注意:虽然上面的示例使用了 if 指令,但通常尽可能避免在 nginx 配置中使用 if,因为它可能会导致性能问题。更好的方法可能是使用 try_files 指令或其他方法。

示例3:防止目录列表

如果你不希望用户能够列出目录的内容,你可以使用 rewrite 指令来重定向到一个错误页面或另一个 URI:

location /some-directory/ {  
    autoindex off;  # 首先关闭目录列表  
    if (!-e $request_filename) {  
        rewrite ^/some-directory/(.*)$ /error-page.html last;  
    }  
}

总结

  • 当使用 rewrite 指令时,确保了解正则表达式的语法和 nginx 的配置方式。
  • 过度使用 rewrite 可能会导致性能下降,特别是在处理大量请求时。因此,尽量保持配置简单和高效。
  • 在生产环境中更改配置之前,最好在测试环境中验证更改。

官方说明:

http://nginx.org/en/docs/http/ngx_http_rewrite_module.html#rewrite

if

用途

根据特定的条件来执行相应的配重块。

语法

if (condition) {  
    ...  
}

condition形式

  • 变量比较,如:`$variable = value`。
  • 变量与正则表达式的匹配, 如:`$variable ~ pattern`。
  • 逻辑操作:`!`(非)、 `-f`(文件存在)、 `-d`(目录存在)、 `-e`(文件、目录、符号链接存在)、 `-x`(可执行文件存在)等。
  • 正则表达式中包含 “}” 或 “;” 字符,整个表达式应该用单引号或双引号括起来。

上下文配置

if 指令在 server 和 location 上下文使用。

示例1:针对MSIE浏览器的重定向

当请求的User-Agent头包含MSIE(Internet Explorer的旧版本)时,Nginx 会将请求重写为 /msie/ 加上原始请求的路径,并停止处理后续的重写规则(break标志)。

if ($http_user_agent ~ MSIE) {  
    rewrite ^(.*)$ /msie/$1 break;  
}

示例2:从Cookie中提取ID

使用正则表达式从Cookie头中提取id的值。如果Cookie中包含形如id=some_value;或id=some_value的片段,那么变量$id将被设置为some_value。

if ($http_cookie ~* "id=([^;]+)(?:;|$)") {  
    set $id $1;  
}

示例3:禁止POST方法

如果请求的方法是 POST,Nginx 将返回405状态码(方法不允许)。这通常用于确保某个位置或服务器仅支持 GET 或其他 HTTP 方法,而不支持 POST。

if ($request_method = POST) {  
    return 405;  
}

示例4:基于$slow变量的带宽限制

如果变量 $slow 为真(需要在其他地方定义或根据其他条件设置),Nginx 将限制发送到客户端的响应速度为每秒10KB。用于防止在慢速连接上发送大量数据,或在某些条件下有意地限制带宽。

if ($slow) {  
    limit_rate 10k;  
}

示例5:基于$invalid_referer的访问控制

如果变量 $invalid_referer 为真(表示请求的 Referer 头无效或不存在,或者不符合某些预期的模式),Nginx 将返回 403 状态码(禁止访问)。常用于防止热链接、保护资源或实施其他基于 Referer 的访问控制策略。

if ($invalid_referer) {  
    return 403;  
}

官方说明:
http://nginx.org/en/docs/http/ngx_http_rewrite_module.html#if

set

用途

用于设置变量。

语法

set $variable value;

上下文配置

set 指令 只能在 server 上下文中使用。

示例:

如果请求的 User-Agent 头包含 MSIE,则 $user_agent 变量将被设置为 "msie",否则它将保持为空字符串。然后,这个变量的值将被包含在返回的响应体中。

location /test {  
    set $user_agent "";  
    if ($http_user_agent ~ MSIE) {  
        set $user_agent "msie";  
    }  
    return 200 "User Agent: $user_agent";  
}

官方说明:

http://nginx.org/en/docs/http/ngx_http_rewrite_module.html#set
http://nginx.org/en/docs/stream/ngx_stream_set_module.html#set

来自: 学习Nginx(八):rewrite、if、set

若有收获,就点个赞吧

  • 16
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Linux技术宅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值