一、rewrite语法 指令语法:rewrite regex replacement[flag] 默认值:none 应用位置:server、location、if regex是PCRE 风格的,如果regex匹配URI,那么URI就会被替换成replacement,replacement 就是新的URI。如
一、rewrite语法指令语法:rewrite regex replacement[flag] 默认值:none 应用位置:server、location、if regex是PCRE 风格的,如果regex匹配URI,那么URI就会被替换成replacement,replacement 就是新的URI。如果rewrite同一个上下文中有多个这样的正则,匹配会依照rewrite指令出现的顺序先后依次进行下去,匹配到一个之后并不会终止,而是继续往下匹配,直到返回最后一个匹配上的为止。如果想要中止继续往下匹配,可以使用第三个参数flag。 如果新URI字符中有关于协议的任何东西,比如http://或者https://等,进一步的处理就终止了,直接返回客户端302。 如果返回的是30x,那么浏览器根据这个状态码和Location响应头再发起一次请求,然后才能得到想要的响应结果。但是,如果不是返回30x状态码,那么跳转就是内部的,浏览器不做跳转就能得到相应。 rewrite是实现URL重定向的重要指令,他根据regex(正则表达式)来匹配内容跳转到replacement,结尾是flag标记 示例:
常用正则表达式:
rewrite的最后一项参数
二、应用场景
三、rewrite指定工作原理rewrite模块的指令有break, if, return, rewrite, set等。rewrite指令所执行的顺序如下: 首先在server上下文中依照顺序执行rewrite模块指令;如果server中进行了rewrite重新,那么以新的URL发起内部跳转,直接匹配location,不会再执行server中的rewrite指令,然后 - 新URL直接匹配location - 如果匹配上某个location,那么其中的rewrite模块指令同样依照顺序执行。 - 如果再次导致URL的rewrite,那么再一次进行内部跳转去匹配location,但跳转的总次数不能超过10次。 四、flag 参数简介1、last如果有last参数,那么停止处理任何rewrite相关的指令,立即用替换后的新URI开始下一轮的location匹配。 如果在location的rewrite也使用last,便会再次以新的URI重新发起内部重定向,再次进行location匹配,而新的URI中极有可能和旧的URI一样再次匹配到相同location中,这样死循环发生了。当循环到第10次时,Nginx会终止这样无意义的循环,并返回500错误。这点需要特别的注意。 2、break停止处理任何rewrite的相关指令,就如同break 指令本身一样。 last的break的相同点在于,立即停止执行所有当前上下文的rewrite模块指令;不同点在于last参数接着用新的URI马上搜寻新的location,而break不会搜寻新的location,直接用这个新的URI来处理请求,这样能避免重复rewite。因此,在server上下文中使用last,而在location上下文中使用break。 3、redirectreplacement 如果不包含协议,仍然是一个新的的URI,那么就用新的URI匹配的location去处理请求,不会返回30x跳转。但是redirect参数可以让这种情况也返回30x(默认302)状态码,就像新的URI包含http://和https://等一样。这样的话,浏览器看到302,就会再发起一次请求,真正返回响应结果的就是这第二个请求。 4、parmanent和redirect参数一样,只不过直接返回301永久重定向 虽说URI有了新的,但是要拼接成完整的URL还需要当前请求的scheme,以及由server_name_in_redirect和port_in_redirect指令决定的HOST和PORT. 还有一个比较有意思的应用,就是如果replacement中包含请求参数,那么默认情况下旧URI中的请求参数也会拼接在replacement后面作为新的URI,如果不想这么做,可以在replacement的最后面加上?。 举例说明:
这样的新URI还是 /show?user=xxx 但如果不加问号:
得到的新URI就是/show?user=$1&xxx=xxx。其中xxx=xxx是旧URI所带的请求参数。 五、示例
|
2022-08-10
2022-08-26
2022-08-26
2022-03-01
2021-07-11