https部署折腾(一):.htaccess配置重定向参数RewriteCond和RewriteRule解释

对于完成一件比较麻烦的事,做完后是一定要写教程的,呃,其实应该是记录过程,也不是想教谁,只是希望以后自己再用的时候还找得到用法。话说过程是惊险刺激的,有时兴奋,有时却恨不得去屎… 而扫尾工作就是最枯燥到的了,比如现在… 但是事后不总结、不记录,那是永远无法成长的。就像我这次部署https一样,其实那篇发泄文(见《吐个槽,糟心的一天》)写完就打算放弃部署https了,结果文章结尾的时候提示了自己一个很重要的问题,最后找到了方法部署成功… 这个后期再说。

今天玩了下.htaccess,所以提前把这个写了,相当于是部署https的周边技术吧,有时间写一点,最后再汇总成如何部署https,我觉得这样不错,好了,说了这么多闲话了,开始教程吧。

.htaccess对于我来说就是用来做301重定向的,它的主要作用貌似也就是这个了。主要靠写在文件中的语句执行重定向,比如

<IfModule mod_rewrite.c> 
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

这个是一个基本配置,将“/”和404重定向到/index.php去,我们可以看到语句有好几种,比较关键的是RewriteCond和RewriteRule。

先举个栗子:

RewriteCond %{HTTP_HOST} ^(juw)end(s)\.com.*$ [NC]
RewriteRule aa(.*)cc(.*)$ http://ww\./$2/$1/%1/%2 [R=301,L]

看起来是有点复杂,先看结果:

网址输入地址:juwends.com/aaa/bbb/ccc/?p=1
重定向地址:http://ww.///a/bbb/c/juw/s?p=1

继续阅读

HTTPS终于搞好了

日志

网站终于实现HTTPS加密访问了!!!

wordpress + 阿里云虚拟主机 + 阿里云CDN + startssl免费证书

看!那抹绿色的“https”和小锁多漂亮啊…

那抹绿色的“https”和小锁多漂亮啊

还是折腾了一天多吧,现在终于搞好了,上一篇文章就可以看出我搞的是多么的辛苦和郁闷…

https虽然配置好了,但是要想整站https还有很多地址要更改,也会有些插件不能再用了,过几天补教程,这里的坑可多着呢…

凌晨5点了… 该睡觉了。

吐个槽,糟心的一天

状态

今天搞了一天的https配置,证书也申请了,CDN也配了,最后配置上https用不上… 结果啥都没有搞出来… 真是很糟心的一天…

我用的是阿里云的虚拟主机,要使用https需要配置阿里云的CDN,于是开通了CDN。

还需要证书,又去startssl申请了免费证书,配置到CDN后,以为输入https://www.juwends.com就可以进入https模式了… 哪知各种问题,本该使用https的css文件依然是http… 还有好多文件url也是那样… 后台就更无语了,直接无限重定向,完全进不去…

然后,我就把整个站点下载到本地,在本地尝试配置https,结果配置完后什么问题都没有!!!f**k

也许是本地使用Apache直接配置的https,而阿里云虚拟主机使用的Ngnix+CDN间接配置的https的原因吧,也可能是wordpress的问题,想想,教程好像是hexo搭建的博客,然后使用的阿里云虚拟主机,hexo是静态页面,本来过场就少的多…

唉,想通了再研究吧,有时间学学php呢,哈哈哈

CuteFTP显示隐藏文件

想改.htaccess,发现用CuteFTP连接FTP后看不到这个文件,于是网上搜了下,找到了教程,网上的使用的中文版软件,下面再说说英文版软件的操作。

1,选择软件左边栏的“Site Manager”(站点管理器)栏,如果没有FTP连接就新建一个FTP连接(右键->New->FTP Site),然后在建好的连接上右键->Properties(属性)。

2,选择“Action”(动作)栏。

3,选择下方的“Filter”(过滤器)按钮。

4,在“Filter Properties”(过滤器属性)栏,勾选“Enable filtering”(启用过滤器)。

5,勾选“Serve side filtering”(服务端过滤起)框中的“Enable server side filtering …”(启用服务端过滤器)选项。

6,下方“Remote filter”(远程过滤器)填上“-a”。

这样就设置完毕了,连接FTP,就可以看到隐藏文件.htaccess了。

附个设置图片:

CuteFTP显示隐藏文件

CuteFTP显示隐藏文件

openssl.org打不开的解决方法

想下载openssl,发现下载页面openssl.org/source打不开… 不知道是不是被我国最先进的墙给挡了…

怎么办呢?这时度娘就有用了,用百度搜索“openssl.org/source”,结果的第一条就是该页面了,点击条目尾巴上的“百度快照”,我们就可以看该网页的快照了,相当于看这个页面,虽然可能是之前的数据,但是总比打不开好啊。

然后找到下载地址,下载就可以了!

UIScrollView PagingEnabled的转屏问题

应用支持用户转动手机后,UI会跟随转动,此时就需要对我们的页面设置转屏支持;如果界面中包含UIScrollView(此时要求UIScrollView的width和height是不相等的,看完本文就明白),并且UIScrollView isPagingEnable为true时,在转屏后,UIScrollView的page滑动就会出现问题(无法滑动到正确的页,一般情况下会滑走多个页),如何解决,请继续看。

继续阅读

Win10下安装Deepin Linux双系统导致Win10无法更新和睡眠

之前为了学习linux,在本有的win10系统下安装了Deepin双系统,后面才发现win10貌似无法自动更新了,更新总是失败,而且更意外的是,win10无法睡眠,无法休眠… 点击睡觉按钮后,屏幕是熄了,但是电脑根本没有要睡眠的样子,硬盘一直在转,风扇也在转… 还以为是win10系统出了问题,弄了好久,今天终于真正怀疑到linux上了(其实一直在怀疑,但是还是选择相信Deepin),于是找个PE把启动分区改为了win10的分区,完成后,进入系统,顺利更新,顺利睡眠…

看来Deepin还是存在问题啊,应该是在启动上面,估计win10的更新也有点辣鸡,唉… 蓝瘦香菇… 累觉不爱…

还是换成ubuntu试试吧… 下面来说说怎么恢复成windows启动,网上很多使用mbrfix的,但是我有两块磁盘,不知道磁盘参数该填写什么,还是用比较熟悉的DriverGenius吧。

首先,你得有个PE系统,PE系统里面有DriverGenius,或者类似的磁盘管理软件。

然后,进入PE,打开DriverGenius,看到磁盘后,你会发现win的启动分区盘不是活动的,而linux启动分区是活动的,这时将win的启动分区设置为活动的,然后再保存一下mbr就好了。

重新启动,就可以从windows启动了,这时linux分区并没有删除的,只是不能启动了,进入windows后可以做任何操作了。(我现在只想格式化掉那货…)

SQL中的转义字符

之前写了篇文章《Oracle转义字符》,说到了Oracle中单引号“’”的转义字符是单引号“’”,那么其他的特殊字符的转义字符又是什么呢,如模糊查询的占位符“%”,“_”等。

经过测试,在Oracle中不能再使用单引号“’”来转义“%”,“_”了,而是用反斜杠“\”,不仅如此,还要声明反斜杠“\”是转义字符。

假设表为tb,字段为col,要在col中查询包含“%”或“_”字符的字段,sql如下:

-- Oracle

select * from tb where col like '%\%%' or col like '%\_%' escape '\'

sql中“escape”表明声明反斜杠“\”为转义字符,紧接在“\”后的“%”就表示“%”符号,而左右两边的“%”表示模糊查询占位符。

注意:“%”,“_”作为占位符只会出现在where之后,如果是select ‘%’ from dual就不用转义了。

而MySQL中也是大同小异,不过MySQL不用写“escape”了,直接使用反斜杠“\”就可以了。

继续阅读

更改hosts访问谷歌显示“连接已重置”

更改hosts去访问谷歌,显示“连接已重置”,但是小伙伴们却可以…

查过之后,才发现原来要使用https访问,域名使用“www.google.com.hk”,输入“https://www.google.com.hk”后发现打开了谷歌!

那么要怎么设置才能默认使用https访问呢?

下面就说下Chrome的设置:

设置谷歌为默认搜索引擎

设置谷歌为默认搜索引擎

1,打开设置,找到“搜索”,单击“管理搜索引擎”

继续阅读

360公用库就是一个坑,可以狗带了

日志

最近发现站点变慢,不知何故,但是猜测估计是什么资源加载问题,突然想到公用库,所以今天按F12打开前端控制台,发现有2个公用库的文件获取失败,一个是360公用库useso的jquery,另一个是googleapis的字体opensans…

之前还好好的,为什么无法使用了呢?上网查了才知道原来据说googleapis在北京设点了,然后360就把自己的库给关了…

但是我貌似还是打不开googleapis呢…

360啊,360,你真就是一个坑货,大坑货,深不见底的坑…

无奈,把那两个文件下载下来上传到站点上,重新给个新链接,于是网站加载速度恢复!

Junit测试中多线程的坑

昨晚用Junit测试多线程,代码如下:

private int i = 3;

@Test
public void test() {
	
	for (int i = 0; i < this.i; i ++) {
		new Thread(new Runner()).start();
	}
}

class Runner implements Runnable {
	
	@Override
	public void run() {
		System.out.printlun(123);
	}
}

发现运行后居然没有任何输出…我又运行了好几次,有时又有1~2句输出,但是始终不全…

当时还以为程序有错,clean了class继续,还是一样的,今天早上起来查了下百度,才明白,原来Junit只管自己的运行,就是说当Junit执行完毕后,就会关闭程序,不会关心是否还有自己启动的后台线程在运行。当Junit运行完毕后,如果后台线程还没有执行完毕,那么也是不会再执行了,所以就出现了昨天的情况…

继续阅读

Oracle转义字符

需要更新Oracle数据库中所有表的一个字段“flag”为“I”,语句为:

update table_name set flag = 'I'

“I”作为字符串,所以语句中I需要加上单引号。

由于数据库中有多张表,我不想一条一条的语句写,希望能够通过sql语句直接生成所有的语句,所以写了如下sql:

select 'update ' || table_name || ' set flag = 'I'' || ';' from user_tables

这个时候运行,“报错:ORA-00923: 未找到要求的 FROM 关键字”,报错位置就在’I”的第二个单引号位置,因为单引号配对关系,I不是字符串了,所以就报错了,那么如果要显示一个单引号该怎么做呢?

试了语句:

select ''' from dual

同样也会报错,原来“’”作为一个关键字,如果需要显示“’”,需要使用转义字符,就像java的“\”一样。

而Oracle的转义字符就是单引号“’”,所以sql应该这么写:

select '''' from dual

怎么理解呢?把第二个单引号“’”看成“\”就好了,所以我需要的sql就是:

select 'update ' || table_name || ' set flag = ''I''' || ';' from user_tables

这样就OK啦!

说个Java三目运算坑

前几日,写代码,用到三目运算,判断一个double,如果大于1则返回int,小于1则返回double,可是依照下面的代码,本应该返回int,即1,但是返回的始终是1.0。

Double d = 1.01;
System.out.println(d > 1 ? d.intValue() : d); // 1.0

当时还在想 d.intValue()返回难道不是 int吗,于是试了下面的代码,结果的确返回的int,即1。

Integer i = d.intValue();
System.out.println(i); // 1

想了好久,突然想到,三目运算的数据类型是相同的,也就是说后面返回的结果和第一个数的类型是一致的!!!第一个数是double,所以返回的结果也会是double,即1.0。

是我自己忘记了…

我也来实现ztree模糊搜索功能

之前看了一篇oschina上的关于ztree模糊搜索的文章,我很负责任的说,作者很不负责任,代码不COPY完就贴出来,反正看完似懂非懂,想了想,还是自己实现来得快,于是就自己实现咯…

先看demo,如果感觉效果还不错就继续看下面代码:

主要代码就3块:

1,搜索:

// 模糊搜索name满足条件的节点
function searchNode(value) {
	if (value == "") return;
	
	// 获取与value匹配的节点,使用的ztreeAPI getNodesByParamFuzzy
	var nodes = treeObj.getNodesByParamFuzzy("name", value);

	// 关闭所有节点的高亮
	// 使用API transformToArray获取所有的节点,getNodes()只能获得根节点,属性children也只能获取下一级节点
	var allNodes = treeObj.transformToArray(treeObj.getNodes());

	for (var i = 0; i < allNodes.length; i ++) {

		// 关闭高亮是利用节点属性highlight来控制fontCss实现的
		// 需要配合setting.view中设置的fontCss使用,后面代码会说
		allNodes[i].highlight = false;

		// 更新节点,因为hightlight改变了,使用updateNode可以更新节点
		treeObj.updateNode(allNodes[i]);
	}
	// 先关闭所有节点
	treeObj.expandAll(false);

	// 展开根节点(如果不展开根节点,下面的节点无法展开,不知道是不是bug)
	treeObj.expandNode(treeObj.getNodes()[0],true);

	// 高亮并展开搜索到的节点
	for (var i = 0; i < nodes.length; i ++) {

		nodes[i].highlight = true;
		treeObj.updateNode(nodes[i]); // 更新节点,让高亮生效

		// 展开搜索到的节点的父节点
		treeObj.expandNode(nodes[i].getParentNode(),true);
	}
}

继续阅读

记一场与java.lang.illegalstateexception: stream的遭遇战

我就像只辛勤的小蜜蜂,每天任劳任怨的撸着码…

今天写服务端向浏览器发送文件的代码,运行后,后台报错java.lang.illegalstateexception: stream,查了资料,找了很久,都没能解决问题…

最后突然发现,这个报错信息上面还有一段…(这什么眼神儿啊,居然没看到上面的报错信息),结果错误不是出在流上面,而是传送数据下面的一句代码,就这句代码造成了illegalstatexception的问题… 我也是醉了。

另外,Jfianl传送完流之后,要使用renderNull(),否则,会报java.lang.illegalstateexception: commited的错误。

来说说那句错误的代码,java中字符串是用双引号,而Oracle中字符串是用单引号,正好单引号又是java中的char字符的表示方式。而我在写在写java时写成了:

Record r = new Record();
r.set("status",'0');

而要设置的这个status字段是CHAR(1 BYTE)类型的,就这样,报错为“不是有效的列类型”… 这就是个坑啊!

ztree实现叶子节点半勾选状态

ztree叶子节点半勾选

这只是效果图,demo点击链接查看

ztree是一个前端的基于jQuery的树形结构插件,最近项目要用到,所以就学习了下,功能还是很强大的,但是一些小细节还是无法满足的,于是研究了一天,自己写了几个方法把小细节实现了。

具体业务是这样的:
1,节点可以勾选
2,叶子节点可以半勾选/取消,
3,勾选状态和父节点关联
4,点击叶子节点可以执行方法
5,点击父节点只能展开或收缩

但是研究后发现,ztree不能提供叶子节点自动半勾选和半勾选的自动计算(即自动取消,比如取消父节点,所有叶子节点的半勾选都要取消),也就是说只能手动设置,而后面发现这个还是比较坑:
1,手动设置的半勾选状态必须手动去清除
2,父节点自动计算的半勾选的halfCheck居然是false…

所以需要注意这点,先看看改造后的实例
继续阅读