线上的CDN厂商的nginx的rewrite规则配置验证
环境介绍:
[root@localhost ~]# cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)

nginx服务是编译安装:

yum install -y gcc gcc-c++ make \
openssl-devel pcre-devel gd-devel libxslt-devel \
iproute net-tools telnet wget curl && \
yum clean all && \
rm -rf /var/cache/yum/*
wget http://nginx.org/download/nginx-1.12.2.tar.gz && \
tar zxf nginx-1.12.2.tar.gz && \
cd nginx-1.12.2 && \
./configure --prefix=/usr/local/nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_image_filter_module \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_secure_link_module \
--with-http_stub_status_module \
--with-stream \
--with-stream_ssl_module && \
make -j 4 && make install && \
mkdir -p /usr/local/nginx/conf/vhost && \
rm -rf /usr/local/nginx/html/* && \
echo "ok" >> /usr/local/nginx/html/status.html[root@localhost ~]# /usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.12.2
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-28) (GCC)
built with OpenSSL 1.0.2k-fips  26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_image_filter_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_secure_link_module --with-http_stub_status_module --with-stream --with-stream_ssl_module
[root@localhost ~]# 

验证测试:
为使nginx vhost虚拟主机配置文件更简洁,所以采用include方式,把nginx的rewrite规则写到一个单独的配置文件中

[root@test01 vhost]# grep include /usr/local/nginx/conf/vhost/img.test.conf include /data/www/images/.htaccess; 

下面的rewrite规则是云端CDN的提供的配置规则,但是其中3条规则存在问题

[root@test01 03]# cat /data/www/images/.htaccess
rewrite ^/[a-zA-Z0-9]+/([0-9][0-9])([0-9][0-9])/([0-9]+).gjf$ /uploads/picture/2016/$1/$2/$3.gif last;
rewrite ^/[a-zA-Z0-9]+/([0-9][0-9])([0-9][0-9])/([0-9]+)(png|jpeg|jpg|gif)$ /uploads/picture/2016/$1/$2/$3.$4 last;
rewrite "^/.{6}[0-9]+/([0-9]{2})([0-9]{2})/(.*)$" /uploads/picture/2016/$1/$2/$3 ;
rewrite "^/.{6}[0-9]{4}/(.*)$" /uploads/picture/2016/$1 last;
rewrite "^/.{6}[0-9]{4}[0-9]{8}/(.*)$" /uploads/picture/$1 last; (此规则云端CDN配置有问题,位置应该放到第一的位置就可以了)
rewrite ^/[0-9]+\.([0-9]+)\.([0-9]+)\.([0-9]+)\.(.*)$ /uploads/picture/$1/$2/$3/$4 last; (此规则云端CDN配置有问题,点号不需要转译的)
rewrite ^/[0-9]+/([0-9][0-9])([0-9][0-9])/(.*)$ /uploads/picture/2016/$1/$2/$3 last;(此规则放到最后不合理,应该放到第三条规则的前面)

本人亲自测试最合理的配置文件的规则如下:

[root@test01 ~]# cat /data/www/images/.htaccess
#rewrite ^/[a-zA-Z0-9]+/(.*)$ /uploads/picture/$1 last;
rewrite "^/.{6}[0-9]{4}[0-9]{8}/(.*)$" /uploads/picture/$1 last;
rewrite ^/[a-zA-Z0-9]+/([0-9][0-9])([0-9][0-9])/([0-9]+).gjf$ /uploads/picture/2016/$1/$2/$3.gif last;
rewrite ^/[a-zA-Z0-9]+/([0-9][0-9])([0-9][0-9])/([0-9]+)(png|jpeg|jpg|gif)$ /uploads/picture/2016/$1/$2/$3.$4 last;rewrite ^/[0-9]+/([0-9][0-9])([0-9][0-9])/(.*)$ /uploads/picture/2016/$1/$2/$3 last;
rewrite "^/.{6}[0-9]+/([0-9]{2})([0-9]{2})/(.*)$" /uploads/picture/2016/$1/$2/$3 ;
rewrite "^/.{6}[0-9]{4}/(.*)$" /uploads/picture/2016/$1 last;
rewrite ^/[a-zA-Z0-9]+.([0-9]+).([0-9]+).([0-9]+).(.*)$ /uploads/picture/$1/$2/$3/$4 last;

*基于CDN提供的原nginx rewrite规则顺序逐一进行实例演示:**

规则1

rewrite ^/[a-zA-Z0-9]+/([0-9][0-9])([0-9][0-9])/([0-9]+).gjf$ /uploads/picture/2016/$1/$2/$3.gif last;

说明:

/[a-zA-Z0-9]+/:匹配到任意的字符串;
$1指的是第一个圆括号([0-9][0-9]) 中的2位数;
$2指的是第二个圆括号([0-9][0-9]) 中的2位数;
$3指的是第三个圆括号([0-9]+)中的任意数字;([0-9]+).gjf:匹配到以gjf结尾的文件跳转到请求服务器上的([0-9]+).gif文件【注意:服务器上的([0-9]+).gif这个图片文件是必须存在的】

正常的浏览器访问:

http://img.test.com/uploads/picture/2016/08/03/1501742944.gif
http://img.test.com/uploads/picture/2016/08/03/1501742944.gif?base6412345
http://img.test.com/uploads/picture/2016/08/03/1501742944.gif???dwer

通过匹配到rewrite规则 浏览器访问:

http://img.test.com/awe21/0803/1501742944.gjf
http://img.test.com/22KDJH21/0803/1501742944.gjf??base64

服务器上文件的位置:

[root@test01 03]# ll /data/www/images/uploads/picture/2016/08/03/1501742944.gif
-rw-r--r--. 1 root root 184440 Aug  3  2017 /data/www/images/uploads/picture/2016/08/03/1501742944.gif

规则2:

rewrite ^/[a-zA-Z0-9]+/([0-9][0-9])([0-9][0-9])/([0-9]+)(png|jpeg|jpg|gif)$ /uploads/picture/2016/$1/$2/$3.$4 last;

说明:

/[a-zA-Z0-9]+/:匹配到任意的字符串;
$1指的是第一个圆括号([0-9][0-9]) 中的2位数;
$2指的是第二个圆括号([0-9][0-9]) 中的2位数;
$3指的是第三个圆括号([0-9]+)中的任意数字【注意:这些数字必须是服务器上存在的并且以png|jpeg|jpg|gif结尾文件的前面的数字】;
$4指的是第四个括号(png|jpeg|jpg|gif)中的服务器上必须存在的以png|jpeg|jpg|gif结尾的文件

实例演示:

http://img.test.com/uploads/picture/2016/07/28/1469696883.jpeg
http://img.test.com/uploads/picture/2016/07/28/1469696883.jpeg??base64
http://img.test.com/aA01/0728/1469696883jpeg??base64
http://img.test.com/1/0728/1469696883jpeg
http://img.test.com/34chk/0728/1469696883jpeg
http://img.test.com/chkDHK/0728/1469696883jpeg
http://img.test.com/chkDHK123654/0728/1469696883jpeg?2345

规则3:

rewrite "^/.{6}[0-9]+/([0-9]{2})([0-9]{2})/(.*)$" /uploads/picture/2016/$1/$2/$3 ;

说明:

^/.{6}[0-9]+/:匹配到任意6个字符串加任意数字;
$1指的是第一个圆括号([0-9]{2}) 中的2位数;
$2指的是第二个圆括号([0-9]{2}) 中的2位数;
$3指的是第三个圆括号(.*)中的任意字符串。当然$1,$2,$3这些字符串必须是服务器上实实在在存在的字符串,只有这样在浏览器请求时,才能获取到服务器上的图片

实例演示:
http://img.test.com/uploads/picture/2016/07/28/1469696883.jpeg
http://img.test.com/cHrtwK123/0728/1469696883.jpeg
http://img.test.com/cHrtwK1234/0728/1469696883.jpeg
http://img.test.com/cHrtwK4/0728/1469696883.jpeg??base64

规则4:

rewrite "^/.{6}[0-9]{4}/(.*)$" /uploads/picture/2016/$1 last;

说明:

^/.{6}[0-9]{4}:匹配到任意6个字符串加任意4个数字

实例演示:


http://img.test.com/uploads/picture/2016/07/28/1469696883.jpeg
http://img.test.com/cHrtwK4123/07/28/1469696883.jpeg
http://img.test.com/cH23wK4155/07/28/1469696883.jpeg

以下这样的是不符合规则的,所以找不到文件

http://img.test.com/cH23wK41/07/28/1469696883.jpeg

规则5:

rewrite "^/.{6}[0-9]{4}[0-9]{8}/(.*)$" /uploads/picture/$1 last;

说明:

^/.{6}[0-9]{4}[0-9]{8} :匹配到任意6个字符串加任意4个数字再加8个任意的数字

实例演示:

http://img.test.com/uploads/picture/2016/07/28/1469696883.jpeg

经测试,此rewrite规则放到此位置,是匹配不到图片的,所以位置得变动下,把此规则放到规则的首位就可以了

http://img.test.com/uploads/picture/2016/07/28/1469696883.jpeg
http://img.test.com/weijdg444433336666/2016/07/28/1469696883.jpeg

规则6:

rewrite ^/[a-zA-Z0-9]+.([0-9]+).([0-9]+).([0-9]+).(.*)$ /uploads/picture/$1/$2/$3/$4 last;

注意:此处的点号是不需要转译的,转译会导致rewrite规则不可用,就如下面的这条rewrite规则是不正确的

rewrite ^/[0-9]+\.([0-9]+)\.([0-9]+)\.([0-9]+)\.(.*)$ /uploads/picture/$1/$2/$3/$4 last;

实例演示:

下面的请求是可以打开的
http://img.test.com/SHDw.2017.11.26.1520924032.png
http://img.test.com/1wer1.2016.07.28.1469696883.jpeg
http://img.test.com/SHDw.2018.08.18.1489719802.png?base64http://img.test.com/1wer1.2016.07.28/1520924032.png
http://img.test.com/SHDw.2018.08.18/1489719802.png?base64
http://img.test.com/SHDw.2017.11.26/1520924032.png

规则7:

rewrite ^/[0-9]+/([0-9][0-9])([0-9][0-9])/(.*)$ /uploads/picture/2016/$1/$2/$3 last;

实例演示:
下面的请求是打不开的
http://img.test.com/1345/0728/1469696883.jpeg
http://img.test.com/1232345/0803/1661442694.jpg
http://img.test.com/66/0803/1661442694.jpg

*于是把第七条规则放到第四条规则:rewrite "^/.{6}[0-9]+/([0-9]{2})([0-9]{2})/(.)$" /uploads/picture/2016/$1/$2/$3 ; 前面进行
测试**
下面的请求都是可以打开的

http://img.test.com/1345/0728/1469696883.jpeg
http://img.test.com/1232345/0803/1661442694.jpg
http://img.test.com/66/0803/1661442694.jpg

规则八:
让我们继续看下本人亲自测试的文件:

[root@test01 ~]# cat /data/www/images/.htaccess
#rewrite ^/[a-zA-Z0-9]+/(.*)$ /uploads/picture/$1 last;
rewrite "^/.{6}[0-9]{4}[0-9]{8}/(.*)$" /uploads/picture/$1 last;
rewrite ^/[a-zA-Z0-9]+/([0-9][0-9])([0-9][0-9])/([0-9]+).gjf$ /uploads/picture/2016/$1/$2/$3.gif last;
rewrite ^/[a-zA-Z0-9]+/([0-9][0-9])([0-9][0-9])/([0-9]+)(png|jpeg|jpg|gif)$ /uploads/picture/2016/$1/$2/$3.$4 last;rewrite ^/[0-9]+/([0-9][0-9])([0-9][0-9])/(.*)$ /uploads/picture/2016/$1/$2/$3 last;
rewrite "^/.{6}[0-9]+/([0-9]{2})([0-9]{2})/(.*)$" /uploads/picture/2016/$1/$2/$3 ;
rewrite "^/.{6}[0-9]{4}/(.*)$" /uploads/picture/2016/$1 last;
rewrite ^/[a-zA-Z0-9]+.([0-9]+).([0-9]+).([0-9]+).(.*)$ /uploads/picture/$1/$2/$3/$4 last;

如果把#rewrite ^/[a-zA-Z0-9]+/(.*)$ /uploads/picture/$1 last; 注释掉的规则放到第一条规则后面的任意位置进行测试

不显示文件:
http://img.test.com/qwerty1/2016/07/28/1469696883.jpeg
http://img.test.com/qwerty123/2016/07/28/1469696883.jpeg
http://img.test.com/qy123/2016/07/28/1469696883.jpeg
可以显示文件:
http://img.test.com/qwerty444455556666/2016/07/28/1469696883.jpeg

*于是干脆去掉注释放到第一条规则rewrite "^/.{6}[0-9]{4}[0-9]{8}/(.)$" /uploads/picture/$1 last;的前面进行测试:**

以下链接都可以正常的显示图片了:

http://img.test.com/qwerty1/2016/07/28/1469696883.jpeg
http://img.test.com/qwerty123/2016/07/28/1469696883.jpeg
http://img.test.com/qy123/2016/07/28/1469696883.jpeg
http://img.test.com/qwerty444455556666/2016/07/28/1469696883.jpeg

但是接着有发现:

http://img.test.com/uploads/picture/2016/07/28/1469696883.jpeg
http://img.test.com/uploads/picture/2018/08/18/1489719802.png
http://img.test.com/uploads/picture/2017/11/26/1520924032.png

相对路径的访问请求此时却打不开了,报错404,于是尝试把此规则放到其他规则的后i面进行测试,发现相对路径的访问请求都是不好使的。
于是注销掉此规则,下面的相对路劲的访问链接是又可以打开了

http://img.test.com/uploads/picture/2016/07/28/1469696883.jpeg
http://img.test.com/uploads/picture/2018/08/18/1489719802.png
http://img.test.com/uploads/picture/2017/11/26/1520924032.png

总结:
Apache和nginx的rewrite规则的匹配是有顺序的,而且是从上往下依次匹配的。如果上面优先被匹配到就不再匹配下面的规则。

转载于:https://blog.51cto.com/wujianwei/2158489

nginx之线上CDN的rewrite规则修改相关推荐

  1. Nginx高级应用--负载均衡、rewrite规则

    Nginx除了可以用作web服务器外,他还可以用来做高性能的反向代理服务器,它能提供稳定高效的负载均衡解决方案.nginx可以用轮询.IP哈希.URL哈希等方式调度后端服务器,同时也能提供健康检查功能 ...

  2. Nginx配置请求转发location及rewrite规则

    location = / {# 精确匹配 / ,主机名后面不能带任何字符串[ configuration A ] }location / {# 因为所有的地址都以 / 开头,所以这条规则将匹配到所有请 ...

  3. index.php后有乱码后缀,phpExcel在线下wamp环境下,正常导出,同样的代码到线上Linux导出文件无法打开,修改文件后缀为.xls后乱码...

    本人是用phpExcel导出会员表到浏览器,在线下测试正常,可以导出,也无编码错误, 1.线下正常导出的表格 2.线上导出有问题的表格 3,修改后缀后显示乱码 现贴出代码. case 'test': ...

  4. 前端项目线上环境搭建(Nginx)和线上部署(推荐)

    本次主要讲解的是服务器上node环境的搭建,以及vue/react/等的项目的部署,作为一名前端,一定要学会哦. 购买云服务器/主机 云服务器:阿里云.百度云.新浪云.腾讯云 主机:不建议购买,共享的 ...

  5. 雷林鹏分享:YAF 在Nginx环境下的Rewrite规则

    这2天在学习YAF框架,在nginx环境下参照手册配置rewrite规则后,访问页面出现404错误,最后发现是rewrite规则书写上出现了些错误. 手册提供的Nginx的Rewrite: serve ...

  6. apache rewrite 规则转换 nginx rewrite 的网站

    在将网站apache迁移到nginx时 相信不少人头疼rewrite规则的转换 偶然间发现下面的网站 感觉不错 推荐给大家 http://www.anilcetin.com/convert-apach ...

  7. 第十六届全国大学生智能车竞赛线上比赛-赛前开题

    简 介: 为了保证参加智能车竞赛线上比赛队伍所设计的赛道符合比赛标准,便于对赛道进行检查以及比赛时便于进行计分.本文给出了比赛前所有队伍进行赛前开题-也就是赛道审核的要求. 关键词: 智能车竞赛,赛道 ...

  8. 从线下走到线上,艺术品能否找到新突破口?

    艺术品因其具有的收藏价值.文化价值.观赏价值以及不可复制性,让收藏者愿不远万里前去赴约,许以千金只求抱得珍品归.中国作为有五千年悠久历史的古国之一,前人留下的传世艺术品不计其数,艺术品交易需求不小,但 ...

  9. 无锡计算机编程表演赛2021,“云动迎新春 欢乐满锡城” 无锡市2021新春全民健身线上运动会即将上线!...

    原标题:"云动迎新春 欢乐满锡城" 无锡市2021新春全民健身线上运动会即将上线! 运动添福 福到门开 心想事成 万事如意 步步高升 笑口常开 财源广进 还有三天就将迎来牛气满满的 ...

最新文章

  1. dlp防泄密系统卸载_浙江好用的企业图纸防泄密软件推荐,局域网内部图纸透明加密方案...
  2. 博客之星活动,我在行动
  3. sklearn模型预测性能评估(二)
  4. jquery 选择器,模糊匹配
  5. 干货分享:如何使用Kubernetes的Ingress API
  6. Redis在项目中的地位及使用场景剖析
  7. 显卡显存故障检测工具_为RTX30系显卡做准备,骨伽GEX750金牌全模组电源装机体验...
  8. Flask成长笔记--在Flask中加密的方式
  9. matlab做聚类分析瓶面柱状图,MATLAB聚类分析工具箱
  10. Unity 导入高分辨率图片
  11. 软件开发模式(瀑布、原型、增量、螺旋、敏捷开发)
  12. 搞笑GIF动图怎么制作
  13. 对信息断舍离进行时——一段自我反省
  14. Eventide 2022假日活动
  15. 实时获取SDN网络拓扑中交换机流表项的思路
  16. 抖音 快手 等短视频自动向下滑动
  17. android测量图片工具,ImageMeter Pro(图像测距)
  18. 前端通用SEO技术优化指南
  19. vue三级路由router-view不显示问题,路由嵌套不显示
  20. java 快速开发平台

热门文章

  1. 安装ORACLE RAC时,用到的一些小命令1.弹出CD,2:配置时间同步,3.查看磁盘信息UUID
  2. 【Redis】15.Redis主从复制
  3. Android Studio 生成 ButterKnife 注入的插件
  4. JS语言的基本构成、变量、数据类型
  5. Java面试题集(二)list与Map相关知识(1.2)
  6. Spring Data Redis入门示例:基于RedisTemplate (三)
  7. EEPROM的操作---SPI接口和I2C接口
  8. MySQL初始化脚本mysql_install_db使用简介及选项参数
  9. UE4 Run On Server与Run on owning client
  10. 用python实现:找出1到101 之间的质数