subject 我的酱香之路
一、
男人喜欢喝点酒,是一件很正常的事。我其实并不太懂酒,也不算是酒鬼,平时在自己家里基本不喝酒。现在,假如可以选择,那么我只喝酱香酒。
咱们中国人,一般来说,年轻时喜欢喝啤酒。慢慢的,随着年龄和阅历的增长,除了实在不能喝酒的人,一般都会逐渐开始接触白酒。从开始的抗拒、不喜,慢慢的开始感受到酒的妙处,从纯粹的应付场面,到开始感觉有点自得其乐,甚至有点沉迷于酒酣耳热的氛围之中。
酒这个东西,我一直觉得,它和那些最终会有点成瘾的茶呀、烟呀、咖啡呀之类有一些共同的属性,就是一开始接触的时候,你不会觉得它很好喝(吃),而是在半推半就或者在别人的劝导之下,开始勉为其难的尝一点,再逐渐发现好像有点意思,然后感觉终于能体会其中的些许美妙的意境,直到最后惊觉自己已被某种不可名状的感觉俘虏而不可自拔。
说到酒,中国人都知道,最好的就是茅台,国酒么。但是,为什么说茅台是好酒?其实未必每个人都能说得上来,难道是因为茅台它贵么?
对,也不对!
茅台当然不是因为它贵才是好酒,而是因为它好所以才贵。
假如你拿茅台给毛头小伙喝,尤其是没有喝过酱香酒的,那么第一次喝的时候,十个里面有九个半心里会说:茅台啊,很贵的酒啊,我尝尝!什么?就这?这么冲,这么难喝的玩意儿还卖这么贵,傻子才爱喝!
其实,毛头小伙心里想的一点儿没错,绝大部分人(包括我)开始的时候,都是无法领略酱香酒的妙处的。以江南一带为例,大部分地产酒都是浓香型的,并且度数一般也不超过50°,入口比较顺畅,除了酒香,往往不怎么辣甚至还带点甜,无论你是不是酒鬼,都还算比较好入口。而酱香酒则不然,假如是初次接触,一小口下去,那种强烈的冲击感常常使人无法适应。即使酒香浓郁,但同时扑鼻而来的还有辣、涩、苦、酸、甜等等各种强烈的刺激,并且是太刺激了!给人的感觉是这酒味道怪怪的,一点儿也不好喝。
我不知道别人是怎么爱上酱香酒的,对我而言,从抗拒到接受,再到热爱,这个过程大概花了有三到五年。
今天先写这么多,假如有人看再继续。
by: fanshome
visibility 831
2024-05-15 08:50 (UTC)
subject A PHP method for determining whether a browser supports AVIF images
The latest generation of image compression format AVIF is very good, the effect of reducing the size of the picture is very obvious, and the new version of the browser of major companies has been supported.
But, but! Microsoft's Edge so far (2023-06) does not support AVIF, only WebP, so what to do?
It is not advisable to directly determine whether the browser is edge, because there is more than one browser that does not support avif, and a more scientific and trouble-saving approach is to determine whether the accept in the browser request header accepts avif.
Let's take PHP as an example:
by: fanshome
visibility 1545
2023-06-14 02:49 (UTC)
subject php判断浏览器是否支持avif格式图片的一种方法
最新一代图片压缩格式avif非常好,图片缩小体积效果十分明显,各大公司的新版浏览器已经纷纷支持。
可是,可是!微软的edge到目前为止(2023-06)还没有支持avif,只支持webp,那么怎么办呢?
直接判断浏览器是否是edge并不可取,因为不支持avif的浏览器不止它一种,比较科学而省事的做法是判断浏览器请求头里的accept是否接受avif.
下面以php为例:
by: fanshome
visibility 2642
2023-06-10 12:35 (UTC)
subject 统计搜索引擎对网站地图文件或robots.txt的访问记录的一种方法
一般而言,各大搜索引擎都允许提交网站地图,例如网站根目录下的“sitemap.xml”文件,是xml格式的文本文件。当提交了网站地图后,搜索引擎蜘蛛来访时,可能会读取:http://www.domain.com/sitemap.xml,以获得你网站的所有链接,以便收录。
但是,我很好奇,这个网站地图到底被哪些搜索引擎来抓取了呢?抓取频次如何呢?
由于网站地图本身是文本文件,不能直接写入统计代码。虽然有些搜索引擎允许自定义网站地图文件后缀,例如可以是.php文件。但是为了统一起见,还是使用比较规范一点的xml后缀比较省事。再者,假如想统计robots.txt文件的访问记录呢?这个文件名可是全球统一没得改的。
一种方法是修改php.ini配置文件,找到 AddType application/x-httpd-php 这一行,在后面添加想要使用以php方式执行的文件后缀,比如xml,txt。我没有试过,怕带来不必要的麻烦。
我使用的方法,以apache2 web server为例,先改名网站根目录下的sitemap.xml和robots.txt,比如改成map.xml和bots.txt,然后在.htaccess文件(或者apache配置文件.conf)中定义重写规则,遇到访问的文件名不存在时,重写request uri到一个脚本文件,比如php。
下面以.htaccess文件为例:
by: fanshome
visibility 1612
2023-06-02 16:00 (UTC)
subject 网站的页面访问量以及搜索引擎爬虫访问量的统计方法
统计页面访问量的方法有无数种,这里介绍我的“低级”方法:
1、当然是先用数据库建立一张访问统计表,每个需要统计的页面单独需要建一个字段,比如首页就用“index”。
2、区分是否是移动终端访问,这个其实是有难度的,不可能100%精确统计,我们就退而求其次,大概能统计到位就行,采用正则判断User Agent的方法:
$MOBILE=preg_match("/(android|mobi|phone)/i",$_SERVER['HTTP_USER_AGENT'])?true:false;
这个方法肯定不够精确,只能说大致够用,包含了"android"、"MOBI”、"mobile"、"phone"、"iphone”等关键字,基本OK吧。
3、定义需要统计的页面,用一个数组:
$botsArr=array(//常用搜索引擎爬虫识别
["baidu" ,"Baiduspider"],//百度爬虫
["google","Googlebot"],//谷歌爬虫
["bing" ,"bing"],//微软bing爬虫
["360" ,"360Spider"],//360搜索so.som爬虫
["sogou" ,"sogou"],//搜狗搜索爬虫
["yandex","yandex"],//yandex爬虫
["junkBot","(MJ12bot|AhrefsBot)"],//垃圾蜘蛛爬虫
["otherBot" ,"(bot|spider)"]//其它明确标志自己的爬虫
);
其中,每个数组下标0代表爬虫名字,下标1代表爬虫的USER_AGENT必须包含的关键字,基本做到了简单并且够用。
for($i=0;$i<count($botsArr);$i++){
if(preg_match("/".$botsArr[$i][1]."/i",$_SERVER['HTTP_USER_AGENT'])){
$isBot=true;//是个爬虫
//执行sql,数据库插入统计记录;
...
$i++;
break;
}
}
再定义一个数组,包含所有需要统计的页面文件名称:
$statItem=array("文件名1","文件名2",...);
if(in_array($filename,$statItem)){
//执行SQL语句
//数据库插入统计记录
}
by: fanshome
visibility 1999
2023-05-23 15:54 (UTC)
subject 网络收藏夹网站开发过程中PHP正则表达式忘记使用非贪婪模式带来的一次教训
新版favinavi人性化网络收藏夹网站建设初期,还没有开始宣传,就发现访问量开始8小时内达到了大几千,有点喜出望外。可是再看看又发现不对,统计的关键页面的访问量少的可怜,那么访问量都是哪儿来的呢?
没办法,只能老老实实添加详细统计代码来企图发现问题。果然,详细分析后发现了2个重大问题:
1、异常流量主要来自垃圾蜘蛛爬网;
2、异常流量集中在登录页面“https://favinavi.com/login?o=xxx”。
这就奇了怪了,一个登录页面你个蜘蛛要重复爬几千次是几个意思?!
再仔细分析,发现其实每次垃圾蜘蛛访问的url其实不完全相同,参数o后面的内容非常花样繁多,不属于正常情况下应该出现的。
这里解释一下,参数o是为了记录用户登陆前所在页面,万一用户要干点什么的时候却登录超时了的话,一旦登录成功可以立即跳转到登录前的页面,这样做完全是为了用户能有更良好的体验。问题到底出在哪里呢?
最终分析发现,问题出在提取文件名的正则表达式上。
php代码:
$fn=preg_replace("/^(.*)\?.*$/","$1",$_SERVER['REQUEST_URI']);
其本意是想记录用户登录超时前所访问的页面,去掉问号后面不必要的参数,得到一个“纯净”的文件名,初看其实好像也没啥问题。但其实这个正则表达式是有个大问题的。因为登录前所访问页面的参数中是可能包含参数的,说得有点绕,就是uri中问号后面可能还有问号。虽然经过了urlencode,但问号本质上还是问号。那么问题就来了,上面的正则没有使用非贪婪匹配,就会匹配到最后一个问号,前面的$fn就会变成一个已经带了参数的乱七八糟的文件名,由于网站有多个地方需要处理这个纯净$fn,最后再加上原有的访问参数提交。不光是php,还有JavaScript参与,所以最后的结果是login后面的参数越变越多,越来越长,并且绕不出来。爬虫又不是人,会折腾几次发现不对就放弃,它不断地爬啊爬,每次都当成是爬到了一个新的链接,所以就继续爬喽...
这个bug解决起来其实很简单,把正则表达式括号里的内容改成非贪婪模式就对了:
$fn=preg_replace("/^(.*?)\?.*$/","$1",$_SERVER['REQUEST_URI']);
星号后面再跟一个问号,就成了非贪婪匹配,只留下第一个问号前面的内容,就是我想要的“纯净”的文件名了。
by: fanshome
visibility 1835
2023-06-09 13:43 (UTC)
subject Apache2网站安装开通https协议SSL证书
比较简单实用的一种做法是使用certbot,签发证书、安装、配置web服务器(apache/nginx等)、自动更新一条龙。详细介绍请访问cerbot官网:https://certbot.eff.org/
这里简单介绍主要步骤:(以Ubuntu linux server为例)
先安装snapd
sudo apt install snapd
确保安装的是最新版本内核
sudo snap install core; sudo snap refresh core;
使用snapd安装certbot
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot
最后,运行cerbot并自动配置apache运行https
sudo certbot --apache
其中,certbot会要求输入域名、email等信息,基本上照做就行。
成功后cerbot会返回如下信息
Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/favinavi.com/fullchain.pem
Key is saved at: /etc/letsencrypt/live/favinavi.com/privkey.pem
This certificate expires on 2023-06-26.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.
包含证书和密钥文件保存路径,证书过期日期等,并且告诉您可以让certbot在后台自动更新证书。
by: fanshome
visibility 1763
2023-05-21 07:24 (UTC)
subject 更全面匹配UTF-8中文汉字的正则表达式
网上搜索得到的匹配汉字的正则表达式有一部分并不全面,只匹配了Unicode字符集中\u4E00-\u9FA5范围,并不包含\uF900-\uFA2D这些后期添加的拾遗补缺的、生冷僻的中文字符。而有时候我们需要能比较全面的匹配所有中文字符,则需要在常用的正则表达式上做一些修改补充。
要注意的是,JavaScript和PHP在匹配Unicode字符时,它们的正则表达方式并不一致,不能直接复制过去使用。
php正则记得要添加“/u”修正符。
by: fanshome
visibility 1881
2023-05-19 07:57 (UTC)