一般的蜘蛛都会在后台控制面板中显示名字,例如baidu,google,yahoo,alexa等等,但是如果你用的虚拟主机是cpanel的控制面板,那么发现Unknown robot (identified by 'spider')这个蜘蛛消耗很大的网站流量,那么可以推测这个是百度蜘蛛,因为cpanel的控制面板默认是不识别百度蜘蛛的,所以就会显示为Unknown robot (identified by 'spider')。而且通过robots.txt是无法禁止这个蜘蛛抓取网站内容的——这些垃圾爬虫不可能老老实实遵守robots规则,君不见新浪和字节前段时间还因为robots.txt打了官司,大厂都如此,其他爬虫更别指望。
宝塔屏蔽常见垃圾蜘蛛和扫描工具的两种办法:最近观察网站后台网站蜘蛛爬取状况,除了我们常见的搜索引擎如百度、Google、Sogou、360等搜索引擎蜘蛛之外,还发现有很多垃圾的蜘蛛平繁的爬取本站,通常这些搜索引擎不仅不会带来流量,因为大量的抓取请求,还会造成主机的CPU和带宽资源浪费,屏蔽方法也很简单,按照下面步骤操作即可,原理就是分析指定UA然后屏蔽。
下面给大家带来两种屏蔽垃圾蜘蛛的方法
方法一 通过网站Robots.txt来屏蔽
User-agent: AhrefsBotDisallow: /User-agent: DotBotDisallow: /User-agent: SemrushBotDisallow: /User-agent: UptimebotDisallow: /User-agent: MJ12botDisallow: /User-agent: MegaIndex.ruDisallow: /User-agent: ZoominfoBotDisallow: /User-agent: Mail.RuDisallow: /User-agent: SeznamBotDisallow: /User-agent: BLEXBotDisallow: /User-agent: ExtLinksBotDisallow: /User-agent: aiHitBotDisallow: /User-agent: Rese
最近因为项目,在用Bootsrapt写一些前台,遇到datetimepicker时,在使用方面出现了一些问题,索性记录下来,能用到看看,用不到留着自己参考。
总体调用格式为:
jsp中:
<input type="text" id="demo" >
js中:
$("#demo").datetimepicker();
String类型
默认值: ‘mm/dd/yyyy’
这个是最重要最常用的属性之一了。控制显示格式就是固定值得个性化搭配。
比如,显示 2016-04-21 19:21
$("#demo").datetimepicker({format: 'yyyy-mm-dd hh:ii'});
又比如,你就是喜欢反人类的格式,那你可以这样:
$("#demo").datetimepicker({format: 'hh-yyyy-ii mm:dd'});
这个是扯淡的,就是个意思,你可以自己设计样式,但是里面的字母都代表不同属性:
| 符号 | 意义 |
|---|---|
| p | 12小时制且小写(‘am’ or ‘pm’) |
| P | 12小时制且大写(‘AM’ or ‘PM’) |
| s | 秒,前面不补0 |
| ss | 秒,前面补0 |
| i | 分,前面不补0 |
| ii | 分,前面补0 |
| h | 时,24小时制,前面不补0 |
| hh | 时,24小时制,前面补0 |
| H | 时,12小时制,前面不补0 |
| HH | 时,12小时制,前面补0 |
| d | 日,前面不补0 |
| dd | 日,前面补0 |
| m | 月,数字表示,前面不补0 如:4 |
| mm | 月,数字表示,前面补0 如:04 |
| M | 月,缩写表示,前面补0 如:Apr |
| MM | 月,全称表示,前面补0 |
location = / {# 精确匹配 / ,主机名后面不能带任何字符串[ configuration A ]}location / {# 因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求# 但是正则和最长字符串会优先匹配[ configuration B ]}location /documents/ {# 匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索# 只有后面的正则表达式没有匹配到时,这一条才会采用这一条[ configuration C ]}location ~ /documents/Abc {# 匹配任何以 /documents/Abc 开头的地址,匹配符合以后,还要继续往下搜索# 只有后面的正则表达式没有匹配到时,这一条才会采用这一条[ configuration CC ]}location ^~ /images/ {# 匹配任何以 /images/ 开头的地址,匹配符合以后,停止往下搜索正则,采用这一条。[ configuration D ]}location ~* \.(gif|jpg|jpeg)$ {# 匹配所有以 gif,jpg或jpeg 结尾的请求# 然而,所有请求 /images/ 下的图片会被 config D 处理,因为 ^~ 到达不了这一条正则[ configuration E ]}location /images/ {# 字符匹配到 /images/,继续往下,会发现 ^~ 存在[ configuration F ]}location /images/abc {# 最长字符匹配到 /images/abc,继续往下,会发现 ^~ 存在# F与G的放置顺序是没有关系的[ configuration G ]}location ~ /images/abc/ {# 只有去掉 config D 才有效:先最长匹配 config G 开头的地址,继续往下搜索,匹配到这一条正则,采用[ configuration H ]}location ~* /js/.*/\.js {# 不区分大小写
本文实例讲述了thinkPHP5框架实现多数据库连接,跨数据连接查询操作。分享给大家供大家参考,具体如下:
方法1:在需要连接其他数据库的地方,使用Db::connect()方法动态连接数据库,方法参数为数据库配置的数组或字符串例如:
字符串参数:
Db::connect('mysql://root:1234@127.0.0.1:3306/thinkphp#utf8');
配置数组参数:
Db::connect([// 数据库类型'type' => 'mysql',// 数据库连接DSN配置'dsn' => '',// 服务器地址'hostname' => '127.0.0.1',// 数据库名'database' => 'thinkphp',// 数据库用户名'username' => 'root',// 数据库密码'password' => '',// 数据库连接端口'hostport' => '',// 数据库连接参数'params' => [],// 数据库编码默认采用utf8'charset' => 'utf8',// 数据库表前缀'prefix' => 'think_',]);
详细用法参考thinkphp5完全开发手册:https://www.kancloud.cn/manual/thinkphp5/118059
方法2:在应用配置文件里面添加多个数据库配置,例如:
'database1' => []//数据库配置数组'database2' => []//数据库配置数组
在需要连接时,使用Db::connect("database1")连接指定数据库,执行数据库操作时直接在连接后链式写函数,例如:
$db = Db::connect("database1");$db->name("table")->select();
方法1:利用Db::query("sql")方法执行sql语句,在sql语句中使用database.table的方式指明
正则获取图片链接
preg_match_all('/<img.*?src=["|\']?(.*?)["|\']?\s.*?>/i', $v['content'], $match);
YApi 是高效、易用、功能强大的 api 管理平台,旨在为开发、产品、测试人员提供更优雅的接口管理服务。可以帮助开发者轻松创建、发布、维护 API,YApi 还为用户提供了优秀的交互体验,开发人员只需利用平台提供的接口数据写入工具以及简单的点击操作就可以实现接口的管理。
平台结构大致如下:
在这里插入图片描述
YApi特性:
环境要求
nodejs(7.6+)mongodb(2.6+)
笔者这里直接使用已编译好的包进行安装,因为Node 官网已经把 linux 下载版本更改为已编译好的版本了,我们可以直接下载解压后使用:
在https://nodejs.org/en/download/下载需要的的Nodejs版本
下载node
wget https://nodejs.org/dist/v12.18.3/node-v12.18.3.tar.gz
解压node压缩文件
tar vf node-v12.18.3.tar.gz -C /usr/local
修改node解压后的目录名称
mv node-v12.18.3-linux-x64 node-v12.18.3
进入node安装目录
cd node-v12.18.3
执行node命令查看node版本
./bin/node -v
解压文件的 bin 目录底下包含了 node、npm 等命令,我们可以使用 ln命令来设置软连接,设置软连接后即可使用node命令:
ln -s /usr/loca
一、安装最新版git
(1)安装依赖包
yum install curl-devel expat-devel gettext-devel openssl-devel zlib-develyum install gcc perl-ExtUtils-MakeMaker
(2)卸载旧的git版本
cd /usr/srcwget https://www.kernel.org/pub/software/scm/git/git-2.9.0.tar.gztar -zxvf git-2.9.0.tar.gz
(5)编译安装
cd git-2.9.0make prefix=/usr/local/git allmake prefix=/usr/local/git installecho "export PATH=$PATH:/usr/local/git/bin" >> /etc/bashrcsource /etc/bashrc
(6)检查git版本
git --versiongit version 2.9.0
二、配置SSH免密码登录
(1)创建一个git用户,用来运行git服务
adduser git
(2)初始化git仓库,这里我们选择创建在/data/git/目录下
cd /mkdir /datacd datamkdir /gitcd gitgit init --bare XXXXX.git
(3)owner改为git
chown git:git XXXXX.git
(4)将RSA认证打开
a:
vim /etc/ssh/sshd_config
b:对应内容修改如下
1.RSAAuthentication yes2.PubkeyAuthentication yes3.AuthorizedKeysFile .ssh/authorized_keys
(5)客户端创建秘钥及公钥,这里使用的是Tortoi
下载walle-web
git clone https://github.com/meolu/walle-web-v1.x.git walle-web
修改walle的mysql配置
cd walle-web/vim config/local.php
安装vendor
composer install
初始化项目
./yii walle/setup
给php进程者权限及免密码登录
vipw /etc/passwd
ssh-keygen -t rsa -C "tjjstan@qq.com"ssh-copy-id -i /var/lib/nginx/.ssh/id_rsa.pub git@127.0.0.1
如果报错则在/etc/ssh/ssh_config添加
StrictHostKeyChecking noUserKnownHostsFile /dev/null
确认php进程用户有代码存储仓库/data/www/deploy/520读写权限
usermod -a -G web nginx
设置umask
vim /etc/profileumask 002source /etc/profile
若是只引用jquery的话,监听单选按钮改变事件如下:
<input type="radio" name="sex" checked="checked" value="1">男<input type="radio" name="sex" value="2">女$(document).ready(function() {$('input[type=radio][name=sex]').change(function() {if (this.value == '1') {alert("这是个男孩");} else if (this.value == '2') {alert("这是个女孩");}});});
注意:如果是引用了layui的样式和方法,则上面的监听事件失效,被layui接管了,所以应该如下写法:
layui.use(['form', 'element', 'laydate'], function(){var jQuery = layui.jquery,layer = layui.layer,form = layui.form(),element = layui.element();form.on("radio(sex)", function (data) {var sex = data.value;if (this.value == '1') {alert("这是个男孩");} else if (this.value == '2') {alert("这是个女孩");}});});
关键使用DOMNodeInserted
$('#custom_fields').on('DOMNodeInserted', 'input', function() {$('#custom_fields input').each(function() {}}