Nginx设置目录浏览模式

  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,这样,我们在浏览器上打开的所有文件都将会被下载而非打开浏览 

 

posted @ 2022-07-26 16:30  没有星星的夏季  阅读(1972)  评论(0编辑  收藏  举报