[关闭]
@openxy 2016-03-21T21:03:31.000000Z 字数 2766 阅读 1815

nginx rewrite


介绍

定义规则,改变客户端请求的URI,但仅能改变URI中的的path部分
- https://segmentfault.com/a/1190000002797606

基本示例

  1. server {
  2. listen 80;
  3. server_name start.igrow.cn;
  4. index index.html index.php;
  5. root html;
  6. if ($http_host !~ “^star\.igrow\.cn$&quot {
  7. rewrite ^(.*) http://star.igrow.cn$1 redirect;
  8. }
  9. }

背景知识

ReWrite语法

语法: rewrite regex replacement [flag]
作用域: server, location, if
此指令根据表达式来来更改URI,或修改字符串。
指令根据配置文件中的顺序来执行。

regex

pcre 正则表达式,代表被匹配的URI

replacement

被重写后的URI,如果需要保留query string,注意附加?

Flag

last – 基本上都用这个Flag。
break – 中止Rewirte,不在继续匹配
redirect – 返回临时重定向的HTTP状态302
permanent – 返回永久重定向的HTTP状态301

其它

  1. $hostlocalhost
  2. $server_port88
  3. $request_urihttp://localhost:88/test1/test2/test.php
  4. $document_uri:/test1/test2/test.php
  5. $document_rootD:\nginx/html
  6. $request_filenameD:\nginx/html/test1/test2/test.php

实例

域名跳转

  1. server{
  2. listen 80;
  3. server_name www.jbxue.com;
  4. index index.html index.htm ;
  5. root /www;
  6. rewrite ^/ http://jbxue.com/;
  7. }
  8. # 多域名转向
  9. server{
  10. server_name www.demo.com ;
  11. index index.html index.htm;
  12. root /www;
  13. if ($host ~ "shop\.com") {
  14. rewrite ^(.*) http://www.demo.com$1/ permanent;
  15. }
  16. #三级域名转向
  17. if ($http_host ~* "^(.*)\.seller\.taobao\.com$") {
  18. rewrite ^(.*) http://taobao.com/$1/;
  19. break;
  20. }
  21. # 目录到子域名
  22. {
  23. server_name bbs.demo.com news.demo.com;
  24. location = / {
  25. if ($http_host ~ news\.demo.com$) {
  26. rewrite ^.+ http://news.demo.com/forum-831-1.html last;
  27. break;
  28. }
  29. }
  30. }

目录跳转

  1. # 将根目录下某个文件夹指向2级目录
  2. 如/hzbbs/ 指向 /bbs/hz/
  3. 如果你将last改成permanent,那么浏览器地址栏显示/bbs/hz/
  4. rewrite ^/([0-9a-z]+)bbs/(.*)$ /$1/$2 last;
  5. # 文件和目录不存在的时候重定向
  6. if (!-e $request_filename) {
  7. # do something below or other
  8. proxy_pass http://127.0.0.1;
  9. }

SEO

  1. # 目录自动加“/”,如bbs => bbs/
  2. if (-d $request_filename){
  3. rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent;
  4. }
  5. # 目录转参数
  6. # /123456/xxxx -> /xxxx?id=123456
  7. rewrite ^/(\d+)/(.+)/ /$2?id=$1 last;
  8. }
  9. # abc.domian.com/sort/2 => abc.domian.com/index.php?act=sort&name=abc&id=2
  10. if ($host ~* (.*)\.domain\.com) {
  11. set $sub_name $1;
  12. rewrite ^/sort\/(\d+)\/?$ /index.php?act=sort&cid=$sub_name&id=$1 last;
  13. # /job-123-456-789.html 指向/job/123/456/789.html
  14. rewrite ^/job-([0-9]+)-([0-9]+)-([0-9]+)\.html$ /job/$1/$2/jobshow_$3.html last;

单入口应用

  1. if (!-d $request_filename) {
  2. rewrite ^/([a-z-A-Z]+)/([a-z-A-Z]+)/?(.*)$ /index.php?namespace=user&controller=$1&action=$2&$3 last;
  3. rewrite ^/([a-z-A-Z]+)/?$ /index.php?namespace=user&controller=$1 last;
  4. break;
  5. }

浏览器识别

  1. # 用户使用ie的使用重定向到/nginx-ie目录
  2. if ($http_user_agent ~ MSIE) {
  3. rewrite ^(.*)$ /nginx-ie/$1 break;
  4. }

防盗链

  1. location ~* \.(gif|jpg|swf)$ {
  2. valid_referers none blocked start.igrow.cn sta.igrow.cn;
  3. if ($invalid_referer) {
  4. rewrite ^/ http://$host/logo.png;
  5. }
  6. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注