Nginx是目前用的比较多的http-server,用过的工程师们都知道,Nginx默认是不支持目录访问功能的,需要打开autoindex开关才能让浏览者访问到目录。如何做网络上已经有很多介绍了,而且这也不是本篇文章的重点,本篇文章的写作目的是为了告诉大家如何给这个功能加把锁,而且是可以自己控制时间的锁。

近期笔者负责的一个网站进行改造,其中一项功能就是让浏览者通过点击特定链接获取用户名和密码后才能访问网站资源。笔者这个网站的http-server就是Nginx软件,目录浏览用的是autoindex功能。由于时间短,任务急,笔者原来考虑的FTP用户名密码方案被否了,只能考虑用Nginx 自身功能来实现,笔者经过上网查找资料,终于把这个问题解决了。

首先,Nginx可以和Apache一样对目录进行加密,我们需要在Nginx配置文件nginx.conf 中我们需要加用户名和密码的server 段中添加如下语句

location ^~ /soft/ {
auth_basic   Techlife-Login;
auth_basic_user_file   /usr/local/nginx/conf/passwd;
}
 意思就是说,访问网站的soft目录中的所有文件都必须通过用户名和密码认证,认证文件就是Nginx配置目录中的passwd文件,当然这个你可以随意放置,但注意不要被你想限制的用户浏览到。Passwd文件的格式如下

用户名:密码

冒号需要用英文字符,如果你需要多用户登陆,那你的passwd文件每行都需要是这个格式,还有每行的密码必须使用函数 crypt(3) 加密,生成密码的程序代码如下,是用perl写的,名字是passwd.pl

#!/usr/bin/perl
use strict;

my $pw=$ARGV[0];
print crypt($pw,$pw)."\n";

代码很简单,这里就不解释了,用法如下
# ./passwd.pl test
程序输出结果如下
teH0wLIpW0gyQ
这个字符串就是test用crypt(3)加密后的结果。
到此,这些基本的功能我们都实现完成了,我们可以对任意的用autoindex功能开放浏览权限的nginx目录加密了,任务已经完成了一半,下面该说说怎么让用户名密码定时更换。

 我这里只讲我负责的这个网站的设计思路,起个抛砖引玉的作用,其实还应该有很多其他思路,大家共同发掘吧。我这里用的是时间戳,而且目前试运行阶段,生成的用户名和密码都是相同的,大家可以随意更改,我的代码如下

脚本1:
#!/bin/bash
cd /home/script //进入代码目录
date=`date +%H:%M:%S` //输出当前系统时间,用小时:分钟:秒显示
date_30=`date "+%H:%M:%S" -d '30 minutes'` //输出30分钟后的时间
user=`date +%s` //时间戳,就是从1970年1月1日0点0分到现在一共经过了多少秒,并把这个时间戳赋给user变量
./passwd.pl $user > password.txt //将时间戳用crypt(3)加密并输入到passwd.txt文本文件中
pass=`cat password.txt` //读这个文本文件,将值赋给pass变量
echo $user:$pass > /usr/local/nginx/conf/passwd  //生成密码文件
rm -rf password.txt //删除临时文件
# 生成SQL语句并执行
echo "delete from tec_tec;" > password.sql
echo "insert into tec_tec values(1,'$date','$date_30','$user',"$user");" >> password.sql
mysql -ublog -p1234qwer -Dwordpress < password.sql
rm -rf password.sql
# 删除CACHE文件
cd /var/www/html/php_cache
rm -rf *
# 重启Nginx
cd /etc/rc3.d
./S22nginx restart

这个脚本我都做了注释,生成SQL语句那段不是必要的,那段是为了配合我这个网站的倒记时程序写的,大家重点看以下这几句

脚本2:
user=`date +%s` //时间戳,就是从1970年1月1日0点0分到现在一共经过了多少秒,并把这个时间戳赋给user变量
./passwd.pl $user > password.txt //将时间戳用crypt(3)加密并输入到passwd.txt文本文件中
pass=`cat password.txt` //读这个文本文件,将值赋给pass变量
echo $user:$pass > /usr/local/nginx/conf/passwd  //生成密码文件
rm -rf password.txt //删除临时文件

这保证了用户名和密码是一直处于变化中的,我们只要将这段加在crontab里让这个脚本半小时执行一次即可实现了用户名和密码半小时一换的效果。

 剩下的就是HTML和PHP的事情了,你如果仔细看过我之前脚本1,你会发现我在生成用户名和密码的同时把他们写到了MYSQL数据库中,这样我的PHP程序就可以从数据库中读到更新过的用户名和密码,具体怎么写,不是本文目的,你可以开放思路,自己写出更完美的程序来。

文章如转载,请注明转载自:http://www.5iadmin.com/post/1050.html