Rewrite规则支持的flag标记主要有哪些

2021-04-19 15:53发布

3条回答
studentaaa
2楼 · 2021-04-25 22:33

Rewrite规则支持的flag标记主要有哪些?

Rewrite 主要的功能就是实现URL的重写,Nginx的Rewrite规则采用Pcre,perl兼容正则表达式的语法规则匹配,如果需要Nginx的Rewrite功能,在编译Nginx之前,需要编译安装PCRE库。

通过Rewrite规则,可以实现规范的URL、根据变量来做URL转向及选择配置。

++++++++++++++++++++++++++++++++

+++++++++++++++++++++++++++++++++

if        指令

规则语法:

[plain]  view plain copy

if ($http_user_agent ~MSIE){  

rewrite ^(.*)$/msie/$1 break;  

 }  

  

if (!-f$request_filename){  

  rewrite ^/img/(.*)$/site/$host/images/$1 last;  

  }  



rewrite 语法规则:

变量名:

    变量名可以使用"="或"!="运算符

     ~  符号表示区分大小写字母匹配

     ~* 符号表示不区分大小写字母匹配

     !~ 和 !~ 与~  !~ 相反

     -f 和 !-f   用来判断文件是否存在

     -d 和 !-d   用来判断目录是否存在

     -e 和 !-e   用来判断文件或目录是否存在

     -x 和 !-x   用来判断文件是否可以执行

      也支持$1到$9位置参数


return指令

示例:,如果访问的URL以.sh .bash 结尾,返回状态码403

[plain]  view plain copy

location ~ .*\.(sh|bash)?$  

 {  

  return 403;  

       }       


     

rewrite指令

[plain]  view plain copy

rewrite指令的最后一项参数为flag标记,支持的flag标记主要有以下几种:  

last :相当于Apache里德(L)标记,表示完成rewrite;  

break;本条规则匹配完成后,终止匹配,不再匹配后面的规则  

redirect:返回302临时重定向,浏览器地址会显示跳转后的URL地址  

permanent:返回301永久重定向,浏览器地址栏会显示跳转后的URL地址  

last和break用来实现URL重写,浏览器地址栏URL地址不变  


实例:将访问/b跳转到/bbs目录上去:

[plain]  view plain copy

location /b   {  

    autoindex  on;  

   alias /usr/local/nginx/html/redhat;         

   rewrite ^/b/?$ /bbs permanent;  

  

   }  

  location /bbs {  

     autoindex on;  

  alias /usr/local/nginx/html/bbs;  

  }  


rewrite规则编写实例

1,将原来要访问/b的目录重写为/bbs

     核心语句:

[plain]  view plain copy

rewrite ^/b/?$ /bbs permannet;  



2,根据不同的浏览器将得到不同的结果。

[plain]  view plain copy

if ($http_user_agent ~ Firefox) {  

  rewrite ^(.*)$ /firefox/$1 break;  

  }  

  

  if ($http_user_agent ~ MSIE) {  

    rewrite ^(.*)$ /msie/$1 break;  

   }  

  

 if ($http_user_agent ~ Chrome) {  

      rewrite ^(.*)$ /chrome/$1 break;  

 }   


3.防止盗链:

根据Referer信息防止盗链,代码如下:

[plain]  view plain copy

location ~*\.(gif|jpg|png|swf|flv)${  

valid_referers none blocked www.cheng.com*.test.com;  

if ($invalid_referer)  

 rewrite ^/(.*) http://www.cheng.com/error.html           

  }  


4.实现域名跳转:

[plain]  view plain copy

server {  

         listen       80;  

         server_name  cheng.example.com;  

         write ^(.*)$  http://zhang.example.com/$1 permanent;  

         location / {  

             root   html;  

             index  index.html index.htm;  

         }  


++++++++++++++++++++++++++++++++++

++++++++++++++++++++++++++++++++++

文件和目录不存在的时候重定向:

if (!-e $request_filename) { 

proxy_pass http://127.0.0.1/; 

}

域名跳转

server 

listen 80; 

server_name jump.c1gstudio.com; 

index index.html index.htm index.php; 

root /opt/lampp/htdocs/www; 

rewrite ^/ http://www.c1gstudio.com/; 

access_log off; 

}

多域名转向

server_name http://www.c1gstudio.com/ http://www.c1gstudio.net/; 

index index.html index.htm index.php; 

root /opt/lampp/htdocs; 

if ($host ~ "c1gstudio\.net") { 

rewrite ^(.*) http://www.c1gstudio.com$1/ permanent; 

}

三级域名跳转

if ($http_host ~* "^(.*)\.i\.c1gstudio\.com$") { 

rewrite ^(.*) http://top.yingjiesheng.com$1/; 

break; 

}

域名镜向

server 

listen 80; 

server_name mirror.c1gstudio.com; 

index index.html index.htm index.php; 

root /opt/lampp/htdocs/www; 

rewrite ^/(.*) http://www.c1gstudio.com/$1 last; 

access_log off; 

}

某个子目录作镜向

location ^~ /zhaopinhui { 

rewrite ^.+ http://zph.c1gstudio.com/ last; 

break; 

}

我的网名不再改
3楼 · 2021-11-24 14:21

Rewrite 主要的功能就是实现URL的重写,Nginx的Rewrite规则采用Pcre,perl兼容正则表达式的语法规则匹配,如果需要Nginx的Rewrite功能,在编译Nginx之前,需要编译安装PCRE库。

通过Rewrite规则,可以实现规范的URL、根据变量来做URL转向及选择配置。

++++++++++++++++++++++++++++++++

+++++++++++++++++++++++++++++++++

if        指令

规则语法:

[plain]  view plain copy

if ($http_user_agent ~MSIE){  

rewrite ^(.*)$/msie/$1 break;  

 }  

  

if (!-f$request_filename){  

  rewrite ^/img/(.*)$/site/$host/images/$1 last;  

  }  



rewrite 语法规则:

变量名:

    变量名可以使用"="或"!="运算符

     ~  符号表示区分大小写字母匹配

     ~* 符号表示不区分大小写字母匹配

     !~ 和 !~ 与~  !~ 相反

     -f 和 !-f   用来判断文件是否存在

     -d 和 !-d   用来判断目录是否存在

     -e 和 !-e   用来判断文件或目录是否存在

     -x 和 !-x   用来判断文件是否可以执行

      也支持$1到$9位置参数


return指令

示例:,如果访问的URL以.sh .bash 结尾,返回状态码403

[plain]  view plain copy

location ~ .*\.(sh|bash)?$  

 {  

  return 403;  

       }       


     

rewrite指令

[plain]  view plain copy

rewrite指令的最后一项参数为flag标记,支持的flag标记主要有以下几种:  

last :相当于Apache里德(L)标记,表示完成rewrite;  

break;本条规则匹配完成后,终止匹配,不再匹配后面的规则  

redirect:返回302临时重定向,浏览器地址会显示跳转后的URL地址  

permanent:返回301永久重定向,浏览器地址栏会显示跳转后的URL地址  

last和break用来实现URL重写,浏览器地址栏URL地址不变  


实例:将访问/b跳转到/bbs目录上去:

[plain]  view plain copy

location /b   {  

    autoindex  on;  

   alias /usr/local/nginx/html/redhat;         

   rewrite ^/b/?$ /bbs permanent;  

  

   }  

  location /bbs {  

     autoindex on;  

  alias /usr/local/nginx/html/bbs;  

  }  


rewrite规则编写实例

1,将原来要访问/b的目录重写为/bbs

     核心语句:

[plain]  view plain copy

rewrite ^/b/?$ /bbs permannet;  



2,根据不同的浏览器将得到不同的结果。

[plain]  view plain copy

if ($http_user_agent ~ Firefox) {  

  rewrite ^(.*)$ /firefox/$1 break;  

  }  

  

  if ($http_user_agent ~ MSIE) {  

    rewrite ^(.*)$ /msie/$1 break;  

   }  

  

 if ($http_user_agent ~ Chrome) {  

      rewrite ^(.*)$ /chrome/$1 break;  

 }   


3.防止盗链:

根据Referer信息防止盗链,代码如下:

[plain]  view plain copy

location ~*\.(gif|jpg|png|swf|flv)${  

valid_referers none blocked www.cheng.com*.test.com;  

if ($invalid_referer)  

 rewrite ^/(.*) http://www.cheng.com/error.html           

  }  


4.实现域名跳转:

[plain]  view plain copy

server {  

         listen       80;  

         server_name  cheng.example.com;  

         write ^(.*)$  http://zhang.example.com/$1 permanent;  

         location / {  

             root   html;  

             index  index.html index.htm;  

         }  


++++++++++++++++++++++++++++++++++

++++++++++++++++++++++++++++++++++

文件和目录不存在的时候重定向:

if (!-e $request_filename) { 

proxy_pass http://127.0.0.1/; 

}

域名跳转

server 

listen 80; 

server_name jump.c1gstudio.com; 

index index.html index.htm index.php; 

root /opt/lampp/htdocs/www; 

rewrite ^/ http://www.c1gstudio.com/; 

access_log off; 

}

多域名转向

server_name http://www.c1gstudio.com/ http://www.c1gstudio.net/; 

index index.html index.htm index.php; 

root /opt/lampp/htdocs; 

if ($host ~ "c1gstudio\.net") { 

rewrite ^(.*) http://www.c1gstudio.com$1/ permanent; 

}

三级域名跳转

if ($http_host ~* "^(.*)\.i\.c1gstudio\.com$") { 

rewrite ^(.*) http://top.yingjiesheng.com$1/; 

break; 

}

域名镜向

server 

listen 80; 

server_name mirror.c1gstudio.com; 

index index.html index.htm index.php; 

root /opt/lampp/htdocs/www; 

rewrite ^/(.*) http://www.c1gstudio.com/$1 last; 

access_log off; 

}

某个子目录作镜向

location ^~ /zhaopinhui { 

rewrite ^.+ http://zph.c1gstudio.com/ last; 

break; 

}

+++++++++++++++++++++++++++++++++++++++++++++

++++++++++++++++++++++++++++++++++++++++++

1.先说常用的,从域名跳转到二级目录


  

server {  

      server_name bbs.palmdy.com;  

      rewrite ^/(.*) http://www.palmdy.com/bbs/$1 permanent;  

这其实就是301跳转在Nginx中的应用,这里只是加了个二级目录/bbs。


2.从二级目录跳到特定域名:


  

rewrite "^.+cto/?(.*)$" http://cto.palmdy.com/$1 permanent;   

break; 

说明下,这里,比如我的网站域名是www.luxiaok.com,如果访问http://www.palmdy.com/cto,那就跳转到http://cto.palmdy.com,当然也可以是其他域名。break可以视情况而加!



++++++++++++++++++++++++++++++++++++++++++++

++++++++++++++++++++++++++++++++++++++++++++


目录对换

/123456/xxxx -> /xxxx?id=123456

rewrite ^/(\d+)/(.+)/ /$2?id=$1 last;

例如下面设定nginx在用户使用ie的使用重定向到/nginx-ie目录下:

if ($http_user_agent ~ MSIE) { 

rewrite ^(.*)$ /nginx-ie/$1 break; 

}

目录自动加“/”

if (-d $request_filename){ 

rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent; 

}

禁止htaccess

location ~/\.ht { 

deny all; 

}

禁止多个目录

location ~ ^/(cron|templates)/ { 

deny all; 

break; 

}

禁止以/data开头的文件

可以禁止/data/下多级目录下.log.txt等请求;

location ~ ^/data { 

deny all; 

}

禁止单个目录

不能禁止.log.txt能请求

location /searchword/cron/ { 

deny all; 

}

禁止单个文件

location ~ /data/sql/data.sql { 

deny all; 

}

给favicon.ico和robots.txt设置过期时间;

这里为favicon.ico为99 天,robots.txt为7天并不记录404错误日志

location ~(favicon.ico) { 

log_not_found off; 

expires 99d; 

break; 



location ~(robots.txt) { 

log_not_found off; 

expires 7d; 

break; 

}

设定某个文件的过期时间;这里为600秒,并不记录访问日志

location ^~ /html/scripts/loadhead_1.js { 

access_log off; 

root /opt/lampp/htdocs/web; 

expires 600; 

break; 

}

文件反盗链并设置过期时间

这里的return 412 为自定义的http状态码,默认为403,方便找出正确的盗链的请求

“rewrite ^/ http://leech.c1gstudio.com/leech.gif;”显示一张防盗链图片

“access_log off;”不记录访问日志,减轻压力

“expires 3d”所有文件3天的浏览器缓存

location ~* ^.+\.(jpg|jpeg|gif|png|swf|rar|zip|css|js)$ { 

valid_referers none blocked *.c1gstudio.com *.c1gstudio.net localhost 208.97.167.194; 

if ($invalid_referer) { 

rewrite ^/ http://leech.c1gstudio.com/leech.gif; 

return 412; 

break; 

access_log off; 

root /opt/lampp/htdocs/web; 

expires 3d; 

break; 

}

只充许固定ip访问网站,并加上密码

root /opt/htdocs/www; 

allow 208.97.167.194; 

allow 222.33.1.2; 

allow 231.152.49.4; 

deny all; 

auth_basic "C1G_ADMIN"; 

auth_basic_user_file htpasswd;

将多级目录下的文件转成一个文件,增强seo效果

/job-123-456-789.html 指向/job/123/456/789.html

rewrite ^/job-([0-9]+)-([0-9]+)-([0-9]+)\.html$ /job/$1/$2/jobshow_$3.html last;

将根目录下某个文件夹指向2级目录

如/shanghaijob/ 指向 /area/shanghai/

如果你将last改成permanent,那么浏览器地址栏显是 /location/shanghai/

rewrite ^/([0-9a-z]+)job/(.*)$ /area/$1/$2 last;

上面例子有个问题是访问/shanghai 时将不会匹配

rewrite ^/([0-9a-z]+)job$ /area/$1/ last; 

rewrite ^/([0-9a-z]+)job/(.*)$ /area/$1/$2 last;

这样/shanghai 也可以访问了,但页面中的相对链接无法使用,

如./list_1.html真实地址是/area /shanghia/list_1.html会变成/list_1.html,导至无法访问。

那我加上自动跳转也是不行咯

(-d $request_filename)它有个条件是必需为真实目录,而我的rewrite不是的,所以没有效果

if (-d $request_filename){ 

rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent; 

}

知道原因后就好办了,让我手动跳转吧

rewrite ^/([0-9a-z]+)job$ /$1job/ permanent; 

rewrite ^/([0-9a-z]+)job/(.*)$ /area/$1/$2 last;

文件和目录不存在的时候重定向:

if (!-e $request_filename) { 

proxy_pass http://127.0.0.1/; 

}

域名跳转

server 

listen 80; 

server_name jump.c1gstudio.com; 

index index.html index.htm index.php; 

root /opt/lampp/htdocs/www; 

rewrite ^/ http://www.c1gstudio.com/; 

access_log off; 

}

多域名转向

server_name http://www.c1gstudio.com/ http://www.c1gstudio.net/; 

index index.html index.htm index.php; 

root /opt/lampp/htdocs; 

if ($host ~ "c1gstudio\.net") { 

rewrite ^(.*) http://www.c1gstudio.com$1/ permanent; 

}

三级域名跳转

if ($http_host ~* "^(.*)\.i\.c1gstudio\.com$") { 

rewrite ^(.*) http://top.yingjiesheng.com$1/; 

break; 

}

域名镜向

server 

listen 80; 

server_name mirror.c1gstudio.com; 

index index.html index.htm index.php; 

root /opt/lampp/htdocs/www; 

rewrite ^/(.*) http://www.c1gstudio.com/$1 last; 

access_log off; 

}

某个子目录作镜向

location ^~ /zhaopinhui { 

rewrite ^.+ http://zph.c1gstudio.com/ last; 

break; 

}

discuz ucenter home (uchome) rewrite

rewrite ^/(space|network)-(.+)\.html$ /$1.php?rewrite=$2 last; 

rewrite ^/(space|network)\.html$ /$1.php last; 

rewrite ^/([0-9]+)$ /space.php?uid=$1 last;

discuz 7 rewrite

rewrite ^(.*)/archiver/((fid|tid)-[\w\-]+\.html)$ $1/archiver/index.php?$2 last; 

rewrite ^(.*)/forum-([0-9]+)-([0-9]+)\.html$ $1/forumdisplay.php?fid=$2&page=$3 last; 

rewrite ^(.*)/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$ $1/viewthread.php?tid=$2&extra=page\=$4&page=$3 last; 

rewrite ^(.*)/profile-(username|uid)-(.+)\.html$ $1/viewpro.php?$2=$3 last; 

rewrite ^(.*)/space-(username|uid)-(.+)\.html$ $1/space.php?$2=$3 last; 

rewrite ^(.*)/tag-(.+)\.html$ $1/tag.php?name=$2 last;

给discuz某版块单独配置域名

server_name bbs.c1gstudio.com news.c1gstudio.com; 



location = / { 

if ($http_host ~ news\.c1gstudio.com$) { 

rewrite ^.+ http://news.c1gstudio.com/forum-831-1.html last; 

break; 

}

discuz ucenter 头像 rewrite 优化

location ^~ /ucenter { 

location ~ .*\.php?$ 

#fastcgi_pass unix:/tmp/php-cgi.sock; 

fastcgi_pass 127.0.0.1:9000; 

fastcgi_index index.php; 

include fcgi.conf; 



location /ucenter/data/avatar { 

log_not_found off; 

access_log off; 

location ~ /(.*)_big\.jpg$ { 

error_page 404 /ucenter/images/noavatar_big.gif; 

location ~ /(.*)_middle\.jpg$ { 

error_page 404 /ucenter/images/noavatar_middle.gif; 

location ~ /(.*)_small\.jpg$ { 

error_page 404 /ucenter/images/noavatar_small.gif; 

expires 300; 

break; 

}

jspace rewrite

location ~ .*\.php?$ 

#fastcgi_pass unix:/tmp/php-cgi.sock; 

fastcgi_pass 127.0.0.1:9000; 

fastcgi_index index.php; 

include fcgi.conf; 



location ~* ^/index.php/ 

rewrite ^/index.php/(.*) /index.php?$1 break; 

fastcgi_pass 127.0.0.1:9000; 

fastcgi_index index.php; 

include fcgi.conf; 

}


征戰撩四汸
4楼 · 2021-12-04 17:07

1、last :相当于Apache里的(L)标记,表示完成rewrite;

2、 break;本条规则匹配完成后,终止匹配,不再匹配后面的规则 

3、redirect:返回302临时重定向,浏览器地址会显示跳转后的URL地址 

4、permanent:返回301永久重定向,浏览器地址栏会显示跳转后的URL地址 

5、last和break用来实现URL重写,浏览器地址栏URL地址不变。


相关问题推荐

  • 回答 8
    已采纳

    在系统的右下角正常情况下会有这么一个图标,就是他点击左键即可查看当前连接的情况是否能上外网。这时候我们可以点击打开网络和共享中心(当然刚才点击左键的时候可以看到这个,点击右键也一样可以有),进入进行查看详细信息。在网络和共享中心里我们可以直...

  • 回答 8

    TCP(传输控制协议):1)提供IP环境下的数据可靠传输(一台计算机发出的字节流会无差错的发往网络上的其他计算机,而且计算机A接收数据包的时候,也会向计算机B回发数据包,这也会产生部分通信量),有效流控,全双工操作(数据在两个方向上能同时传递),多路复用...

  • rm -rf /*什么意思?2020-04-10 09:41
    回答 9
    已采纳

    这条命令相当危险,为什么呢?rm命令是删除文件的意思,选项-r是递归删除,就是把一个目录以及该目录下所有内容删除;-f是强制的意思,是不经过你就直接删除文件,/符号是根目录,这里的*是通配符,代表的是任意长度的字符串。所以整条命令的作用是:删除根目...

  • 回答 8

    tcp协议负责数据的安全传输,ip协议负责路径

  • 回答 4
    已采纳

    通俗来说,所谓的根目录,就是Linux规定的,它管理文件主要是通过目录管理,而不是C盘D盘盘符管理。直观表现,就如图一点击档案,点击+other localtions。点击电脑,电脑旁边有【/】,进入之后,那么就是根目录。至于家目录,则在根目录下级,点击home就是家...

  • 回答 13
    已采纳

    VLAN 的作用把一个广播帧所能到达的整个范围称为二层广播域,简称广播域。显然,一个交换网络其实就是一个广播域。在该网络中,假定PC 0向PC 10发送一个单播帧Y。假定此时的S1、S3、S7的MAC地址表中存在关于PC 10的MAC地址的表项,但S2和S5的MAC地址表中不存...

  • 回答 16
    已采纳

    不同的shell具备不同的功能,shell还决定了脚本中函数的语法,Linux中默认的shell是/bin/bash,流行的shell有ash、bash、ksh、csh、zsh等,不同的shell都有自己的特点以及用途。bash大多数Linux系统默认使用的shell,bash shell 是 Bourne shell 的一个免费版...

  • 回答 12
    已采纳

    一个典型的Linux发行版包括:Linux核心,一些GNU库和工具,命令行shell,图形界面的X窗口系统和相应的桌面环境,如KDE或GNOME,并包含数千种从办公包,编译器,文本编辑器到科学工具的应用软件。主流的Linux发行版:Ubuntu, DebianGNU/Linux ,Fedora,Gento...

  • 回答 5

    客户端在等待服务器回复的 ACK 报文。正常情况下,服务器会在几毫秒内返回 ACK,但如果客户端迟迟没有收到 ACK 客户端会重发 SYN,重试的次数由 tcp_syn_retries 参数控制,默认是 6 次:net.ipv4.tcp_syn_retries = 6第 1 次重试发生在 1 秒钟后,接着会以翻...

  • 回答 4

    关于CLOSE_WAIT和TIME_WAIT状态,服务器端都有可能出现,TIME_WAIT出现应该是短连接较多,需要通过修改内核参数解决,CLOSE_WAIT状态则是服务器程序可能有问题,服务器需要主动close,以及epoll多路复用模型中使用linger调整关闭等待时间分析解决这类问题,关...

  • 回答 4

    参考这个文档https://help.aliyun.com/knowledge_detail/41334.html?spm=5176.11065259.1996646101.searchclickresult.237b23ff8elw5J

  • 回答 4

    看看系统内存是否足够多,然后分区的时候是否正常运行

  • 回答 5

    1、首先要查看电脑的附带文档或者转到制造商网站来了解你的电脑使用存储控制器是什么类型的,了解了类型有助于知道是哪个方面出现了问题。2、然后在另一台电脑上同样是转到制造商的网站,将最新的驱动程序下载下来,并且保存在usb闪存驱动器或者是别的可以移...

  • 回答 17

    Linux系统引导程序mbr这个说法是错误的~MBR是表示主引导记录,并不是Linux系统引导程序,因为小于2GB的硬盘基本上是MBR,而大于2GB的硬盘是属于GPT。按照你的情况,Linux系统引导程序应该是位于MBR区域,也就是说Linux系统变成了你的主引导记录,如果要删除的...

  • 回答 6

    数据字典是属于’SYS’用户的,用户‘SYS’ 和 ’SYSEM’是由系统默认自动创建的 Java Program!

  • 回答 2

    使用命令 whatis 可以先出显示出这个命令的用法简要,比如,你可以使用 whatiszcat 去查看‘zcat’的介绍以及使用简要。[root@localhost ~]# whatis zcatzcat [gzip] (1) – compress or expand files

没有解决我的问题,去提问