Nginx常见基本配置—rewrite 使用指南

前言

rewrite是 ngx_ http_ rewrite_ module模块下的指令,使用频率非常高。

内部重定向

rewrite支持的配置环境有 server、 location、 if,它通过 break和 last来完成内部重定向功能。内部重定向是在 Nginx内部发送请求的操作,它可以将请求转发到其他的 location或对 URL进行修改,而不必通过 HTTP连接请求,整个操作非常高效。相关示例如下:

nginx rewire永久重定向 nginx内部重定向_nginx rewire永久重定向


nginx rewire永久重定向 nginx内部重定向_Linux_02

如果需要将内部重定向的请求记录到日志里,请使用 rewrite_ log。

指令: rewrite_ log
语法: rewrite_ log on | off;
默认值: rewrite_ log off;
环境: http、 server、 location、 if

注意:在 rewrite后面跟随的参数始终是正则表达式,并且当内部重定向时 URL的参数是不会丢失的。

域名跳转

通过 rewrite可以实现域名间的跳转,常见的跳转类型有 301、 302。

nginx rewire永久重定向 nginx内部重定向_nginx_03

永久重定向和临时重定向的区分是为爬取搜索引擎而设置的。如果状态码是 301,表示网页地址永久改变,搜索引擎会将旧页面的地址替换成新页面的地址,用户在搜索引擎搜索网站时,就不会再去旧地址了。

如果状态码是 302,表示临时重定向,搜索引擎会保留旧页面的地址,因为它认为跳转只是暂时的。当用户使用搜索引擎搜索网站时,会首先进入旧地址然后再被跳转到 302指定的新地址。

跳转 POST请求

301和 302的跳转并不适合用于 POST请求,如果 POST请求被跳转的话,会先被转化为 GET请求,且请求体的内容会丢失,为此 HTTP 1. 1提供了新的跳转状态码 307和 308。

状态码 307的意义和 302一样,都是临时重定向;而 308和 301一样,都是永久重定向。但如果要求在跳转过程中保持客户端的请求方法不变,需要使用 return指令,示例如下:

nginx rewire永久重定向 nginx内部重定向_nginx_04

指令: return
语法: return code [text];

其中 code是状态码。 return指令会立即返回一个 HTTP状态码给客户端,并附加一个文本信息到响应体中,因为此方式缺少 Default_ Type响应头,所以当使用浏览器打开时无法直接展示文本信息,而会将文本下载到本地。

return指令用法示例如下:

  • return code URL;支持 301、 302、 303、 307和 308跳转。
  • return URL;默认支持 302跳转。

环境: server、 location、 if

注意:如果把 return和 proxy_ pass配置为同一级别,那么会直接执行 return,而不会执行 proxy_ pass,同一 location块下的其他指令也不会再被执行。

设置变量的值

指令: set
语法: set $ variable value;
环境: server、 location、 if
含义:设置指定变量的值,值可以是文本、变量或文本和变量的组合。因为是为当前请求设置的值,所以会在请求结束后被清除掉。

nginx rewire永久重定向 nginx内部重定向_运维_05


nginx rewire永久重定向 nginx内部重定向_nginx_06

限速白名单

Nginx提供了 ngx_ http_ limit_ req_ module和 ngx_ http_ limit_ conn_ module等模块来完成限制请求访问的功能,可以对请求的访问频率、 User-Agent、带宽等各种条件进行限速。

例如当 User-Agent有问题时,要对其进行限速,则代码如下:

nginx rewire永久重定向 nginx内部重定向_nginx rewire永久重定向_07

可以参考 Wiki,网上也有很多相关的文章,这里不再一一赘述。限速一般会对请求的访问频率进行控制,但如果有些请求是内部访问不需要限速该如何处理呢?相关配置如下所示:

nginx rewire永久重定向 nginx内部重定向_nginx_08


nginx rewire永久重定向 nginx内部重定向_Linux_09


注意:整个配置都在 http块内。