Nginx除了可以实现反向代理外,还有个实用的功能,那就是目录浏览,它可以很方便的让我们查看某个目录下的文件内容,并可以选择性的下载。
启用目录浏览
一般的,我们可以创建一个demo.conf配置:
server{
listen 18099;
listen [::]:18099;
location / {
root /home/feng;
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
}
}
说明:
root:就是要进行目录浏览的那个目录,一般用绝对路径指定
autoindex:表示是否开启目录浏览,on表示开启,off表示关闭,默认是off
autoindex_exact_size:表示是否展示文件具体大小,默认on,那么文件大小就是一个很大的数字,这个不利于我们阅读,设置成off,表示将文件大小格式化成熟悉的G、M、KB等格式
autoindex_localtime:目录浏览会展示最新修改时间,这个配置表示这个时间是使用本地时间还是UTC时间,on表示使用本地时间,off表示使用UTC时间,默认off
好了,完成,然后重新加载配置:
#检查配置
sudo nginx -t
#重新加载配置
sudo nginx -s reload
然后就可以使用http://ip:port访问了,比如我这里是http://192.168.139.128:18099/
注:如果发现远程访问打不开怎么办?
首先,在nginx所在主机本地访问http://localhost:port/,比如我这里是http://localhost:18099/:
curl http://localhost:18099/
如果结果正常返回html格式的数据,那么可能是开启了防火墙,端口没有放行。
如果结果显示错误代码,那么根据错误代码去处理,比如404是文件不存在,403表示没有权限。
如果是403无权限,那么可能是启动nginx的用户权限不够,最好的做法是修改nginx.conf文件中启用用户:
我们可以把这个user配置改成root或者其它有权限的用户,然后重新启动nginx就好了
sudo systemctl restart nginx.service
设置权限认证
上面启用目录浏览后,所有用户均可访问,有时候我们需要一些权限控制,输入正确的账号密码后才能访问,为此,我们可以借助htpaawd插件来完成
#Ubuntu安装htpasswd
sudo apt install apache2-utils
#CentOS安装htpasswd
sudo yum install httpd-tools
htpaawd常用参数说明:
-c:往指定一个加密文件添加一个用户;
-n:不更新加密文件,只将加密后的用户名密码显示在屏幕上;
-m:默认采用MD5算法对密码进行加密;
-s:采用SHA算法对密码进行加密;
-d:采用CRYPT算法对密码进行加密;
-p:不对密码进行进行加密,即明文密码;
-b:在命令行中一并输入用户名和密码而不是根据提示输入密码;
-D:删除指定的用户。
所以我们先创建用户密码
# 创建用户及设置密码
sudo htpasswd -c /etc/nginx/htpasswd feng
#/etc/nginx/htpasswd:存放用户及密码的文件,后面在nginx中配置需要
#feng:用户名,命令执行后会要求输入密码
执行后输入密码:
接着修改上面的demo.conf:
server{
listen 18099;
listen [::]:18099;
location / {
root /home/feng;
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
auth_basic "Account and Password is Required";
auth_basic_user_file /etc/nginx/htpasswd;
}
}
说明:
auth_basic:表示是否开启验证,默认是off,如果值是一个字符串,那么未认证的时候,http响应头会携带一个WWW-Authenticate头,在浏览器中弹出的账号密码框中,会展示这句话(不是所有的浏览器都会展示,IE会展示,谷歌不会展示)
auth_basic_user_file:这个就是上面生成的包含用户密码的文件
那么接下来我们刷新页面,就会提示要输入账号密码了:
注:输入密码确定后,貌似没有办法取消,不过我们可以重置用户密码,让原来的账号密码失效:
# 删除用户
sudo htpasswd -D /etc/nginx/htpasswd feng
# 重新添加
sudo htpasswd -c /etc/nginx/htpasswd feng
设置mime-type
到这里,我们基本上已经配置完了,可以使用了,但是我们会发现有一个问题,因为我们开启目录浏览,本质上是为了方便用户下载,但是现在你会发现,在默认规则下,像普通的文本文档,png、jpg等图片,还有pdf等文件,它是直接在浏览器打开而非下载,这种体验不是很友好,我们可以通过nginx设置响应的content-type来解决这个问题。
修改demo.conf,完整的样子应该是这样子的
server{
listen 18099;
listen [::]:18099;
location / {
root /home/feng;
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
auth_basic "Account and Password is Required";
auth_basic_user_file /etc/nginx/htpasswd;
default_type application/octet-stream;
types {
# 这里的type配置将会覆盖原来的配置,结合default_type来使用
# 格式:mime-type extension
# 如:
# image/png png;
# text/html html;
# text/html htm;
}
}
}
说明:
default_type:响应中默认的content-type,如果在types中没有获取到相对应的content-type,就会使用这个参数返回
types:content-type匹配设置,会覆盖默认的设置,只是content-type+文件后缀,如
image/png png;
text/html html;
text/html htm;
注:我们可以在types中什么都不配置,值配置default_type,这样,我们在浏览器上打开的所有文件都将会被下载而非打开浏览