Apache/Nginx伪静态规则匹配http://出现的问题与解决
source link: https://zhang.ge/5020.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
Apache/Nginx伪静态规则匹配http://出现的问题与解决
这个问题不知道有没有人遇到过,反正度娘和谷姐都没能帮到我!困扰了我挺长时间了,今天偶尔将代码放到Apache服务器下测试时,意外解决了!
问题是这样的,我搭建了一个网站icon图标抓取的API接口,正常情况下对象的传参是通过$_GET['url']获取的,因此常规获取图标的地址应该是:
http://domain.com/?url=zhang.ge
http://domain.com/?url=https://zhang.ge
为了开启浏览器缓存和后续的CDN缓存,我的设计思路如下:
①、在图标API网站目录下新建一个cache文件夹,以域名.ico的形式保存图标文件,比如zhang.ge.ico
②、当抓取某个网站的ico时,先通过Nginx或Apache判断是否存在缓存文件,如果存在就直接返回给浏览器,这样在没开启CDN的情况下,因为返回的是纯静态文件,浏览器将会自动缓存,也就是返回304状态,加载速度得到提升!
为了开启浏览器缓存,我将地址如下伪静态化:
http://domain.com/zhang.ge
http://domain.com/https://zhang.ge
这是之前写的Nginx下的伪静态规则:
当时发现不能生效!怎么都匹配不到http://,最后无奈只好用php重写参数中http://了!
今天,我将这个图标API搬家到了万网的免费主机上,是Apache环境,于是按照nginx的规则又写了一遍:
依然不行!奇了怪了,怎么就不能匹配http://呢?于是各种测试,比如将冒号和斜杠缓存url编码都不行!
其实在用nginx失败之后,我用php获取$_GET['url']发现得到的参数中的http://会是http:/,少一个斜杠!而且直接使用http://domain.com/?url=https://zhang.ge获取也是http:/zhang.ge,少一个斜杠!
今天鬼使神差的试了下伪静态中判断http:/,结果成功了!我擦原来要匹配http://,实际上是匹配http:/,少一个斜杠!真实匪夷所思,以前从来没遇到过!
所以上述2个伪静态规则应该如下编写:
A. Nginx伪静态:
B. Apache伪静态:
文章写的很啰嗦,实际上关键性解释就是,在Nginx或Apache中要匹配请求url中的【http://】,应该是匹配【http:/】,也就是少写一个斜杠!大胆猜测匹配其他多个斜杠也应该是少一个斜杠。。。
好了,文章洋洋洒洒写了这么多,网站图标API也是成功搭建在万网免费虚拟主机上了。地址是http://seo.zgboke.com/geticon/ ,虽然是专门给中国博客联盟用的,但是如果你有图标调用需求,也可以在合理使用的前提下自由发挥。
另外,要查看是否实现浏览器缓存很简单,随便访问一个ico地址,比如:
http://seo.zgboke.com/geticon/zhang.ge
然后按下F12进入开发模式,定位到network(网络选项卡),多刷新一次就能看到304状态了:
304表示当前文件来自浏览器缓存,因为请求的文件和服务段的文件一致,不需要重复调取!
当然,本文写到的伪静态规则只是一部分,如果要实现CDN加速,那还得新增相应的规则,不过这都是后话了,等下次我在张戈博客分享这个网站图标抓取API源码的时候,会一并贴上,敬请期待!
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK