nginx 的 rewrite

其实nginx的rewrite模块是在日常nginx配置中十分常用的模块,应该是除了 real_ip 模块、匹配时用到的find_config模块和前端资源配置的 static 模块外的最常用的了吧。

Nginx的处理顺序
nginx的处理顺序是11 个模块,处在realip模块后的就是 rewrite 模块了。而rewrite的模块中的return一旦执行就不会再处理接下来的模块了。而rewrite 分两部分。在 postread阶段,rewrite -> find_config -> rewrite 这样去执行的。

Rewrite 模块

return 指令

rewrite 模块提供了一个指令 return 。
return 的语法可以是

return code [text];
return code URL;
return URL;

而再返回状态码上。

  • Nginx自定义
    • 444 关闭连接 (客户端是收不到这样的返回码)
  • HTTP 1.0 标准
    • 301 http1.0 永久重定向 (会将 post方法变成 get)
    • 302 临时重定向,禁止被缓存 (会将post方法变成 get)
  • HTTP 1.0 标准
    • 303 临时重定向,允许改变方法,禁止被缓存
    • 307 临时重定向,不允许改变方法,禁止被缓存
    • 308 永久重定向,不允许改变方法。
error_page 指令

error_page 指令是在发现错误返回码的时候重新定义返回的页面.
这里需要知道 return 指令会先于 error_page 执行。如果return指令被执行到了,其他的指令都将无法被执行。

1. error_page 404 /404.html;
2. error_page 500 502 503 504 /50x.html;
3. error_page 404 =200 /empty.gif;  (返回码重新置为200)
4. error_page 404 = /404.php;
5. location / {
         error_page 404 = @fallback;
}
    location @fallback {
          proxy_pass http://backend;
}
6. error_page 403 http://example.com/forbidden.html;
7. error_page 404 =301 http://example.com/notfound.html;
rewrite 指令

rewrite 的语法是这样的,可以通过 rewrite_log on; 记录rewrite。

rewrite regex replacement [flag];
  • 将regex指定的url替换成 replacement 这个新的url。
  • 当replacement以 http:// 或者 $schema 开头,直接会返回302重定向。
  • 替换后的url根据flag指定的方式进行处理。
    • last:用replacement这个url 重新进行location匹配。
    • break:break指令停止当前脚本的执行,不再匹配。
    • redirect:返回302重定向。
    • permanent:返回301重定向。

具体的例子来访问一下。
目录的结构为

file
├── first
│   └── 1.txt    # 1
├── second
│   └── 2.txt    # 2
└── third
    └── 3.txt    # 3

如下的配置

        root html/file/;
        location /first {
                rewrite /first(.*) /second$1 last;
                return 200 'first';
        }
        location /second {
                rewrite /second(.*) /third$1 break;
                return 200 'second';
        }
        location /third {
                return 200 'third';
        }

这里再重申一次,last表示匹配上后再匹配,break是中止往下执行,如果第二个没加 break的话,会 return 200 的。

curl -H"Host:rewrite.example.wjx" http://127.0.0.1/first/3.txt
3
curl -H"Host:rewrite.example.wjx" http://127.0.0.1/second/3.txt
3
curl -H"Host:rewrite.example.wjx" http://127.0.0.1/third/3.txt
third

如果不要 last ,不要 break会怎么样呢,他们的作用就是中止下面的return等指令运行
而last是rewrite后的url还可以再作rewrite,break就直接rewrite,不再做新的rewrite了

curl -H"Host:rewrite.example.wjx" http://127.0.0.1/first/3.txt
first
curl -H"Host:rewrite.example.wjx" http://127.0.0.1/second/3.txt
second
curl -H"Host:rewrite.example.wjx" http://127.0.0.1/third/3.txt
third

最后就是 permanent 和 redirect了。其实这两就是301 和 302 ,且如果 replacement 中有协议的话,默认就是 302
如下配置

        location /redirect1 {
                rewrite /redirect1(.*) $1 permanent;
        }
        location /redirect2 {
                rewrite /redirect2(.*) $1 redirect;
        }
        location /redirect3 {
                rewrite /redirect3(.*) http://rewrite.example.wjx$1;
        }
        location /redirect4 {
                rewrite /redirect4(.*) http://rewrite.example.wjx$1 permanent;
        }

访问后如下,第一个会返回301,第二,三个会返回302,第四个返回301。

if 指令

if 指令也是rewrite模块中的一个指令。
其可作用于 server 和 location 块中。
一般可使用 字符串与变量做匹配 '=' 和 '!=' 。
也可以正则匹配 '~' 或 '~!'。
检测文件是否存在'-f' 或 '!-f' ,目录则是 '-d'。
检查文件,目录,软链接是否存在' -e' 或者 '!-e'。
检查是否为可执行文件,使用'-x' 或者 '!-x'。
以下为示例。

if ($http_user_agent ~ MSIE) {
    rewrite ^(.*)$ /msie/$1 break;
}
if ($http_cookie ~* "id=([^;]+(?:;|$))") {
    set $id $1;
}
if ($request_method = POST) {
    return 405;
}
if ($slow) {
    limit_rate 10k;
}
if ($invalid_referer) {
    return 403;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,417评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,921评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,850评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,945评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,069评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,188评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,239评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,994评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,409评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,735评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,898评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,578评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,205评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,916评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,156评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,722评论 2 363
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,781评论 2 351

推荐阅读更多精彩内容