Nginx常见基本配置—rewrite 使用指南
前言
rewrite是 ngx_ http_ rewrite_ module模块下的指令,使用频率非常高。
内部重定向
rewrite支持的配置环境有 server、 location、 if,它通过 break和 last来完成内部重定向功能。内部重定向是在 Nginx内部发送请求的操作,它可以将请求转发到其他的 location或对 URL进行修改,而不必通过 HTTP连接请求,整个操作非常高效。相关示例如下:
如果需要将内部重定向的请求记录到日志里,请使用 rewrite_ log。
指令: rewrite_ log
语法: rewrite_ log on | off;
默认值: rewrite_ log off;
环境: http、 server、 location、 if
注意:在 rewrite后面跟随的参数始终是正则表达式,并且当内部重定向时 URL的参数是不会丢失的。
域名跳转
通过 rewrite可以实现域名间的跳转,常见的跳转类型有 301、 302。
永久重定向和临时重定向的区分是为爬取搜索引擎而设置的。如果状态码是 301,表示网页地址永久改变,搜索引擎会将旧页面的地址替换成新页面的地址,用户在搜索引擎搜索网站时,就不会再去旧地址了。
如果状态码是 302,表示临时重定向,搜索引擎会保留旧页面的地址,因为它认为跳转只是暂时的。当用户使用搜索引擎搜索网站时,会首先进入旧地址然后再被跳转到 302指定的新地址。
跳转 POST请求
301和 302的跳转并不适合用于 POST请求,如果 POST请求被跳转的话,会先被转化为 GET请求,且请求体的内容会丢失,为此 HTTP 1. 1提供了新的跳转状态码 307和 308。
状态码 307的意义和 302一样,都是临时重定向;而 308和 301一样,都是永久重定向。但如果要求在跳转过程中保持客户端的请求方法不变,需要使用 return指令,示例如下:
指令: 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提供了 ngx_ http_ limit_ req_ module和 ngx_ http_ limit_ conn_ module等模块来完成限制请求访问的功能,可以对请求的访问频率、 User-Agent、带宽等各种条件进行限速。
例如当 User-Agent有问题时,要对其进行限速,则代码如下:
可以参考 Wiki,网上也有很多相关的文章,这里不再一一赘述。限速一般会对请求的访问频率进行控制,但如果有些请求是内部访问不需要限速该如何处理呢?相关配置如下所示:
注意:整个配置都在 http块内。