【2022】Nginx目录索引模块ngx_http_autoindex_module

本文介绍了如何利用nginx的ngx_http_autoindex_module模块生成目录列表,当没有index.html时提供友好界面。通过配置autoindex选项,可以显示文件列表,并调整文件大小单位和时间显示为本地时间。遇到中文乱码问题时,设置charset参数可以解决。

使用ngx_http_autoindex_module模块生成目录列表。
通常,当ngx_http_index_module模块找不到索引文件时,会将请求传递给模块。
比如我以下的例子,并没有创建index.html文件,如果没有开启autoindex功能,会返回403错误。
该模块可以用于建立本地YUM仓库。

  • 首先创建一个站点文件:mirrors.yyang.com.conf
server {
	listen 80;
	server_name mirrors.yyang.com;
	
	location / {
		root /repo;
		index index.html;

	}
}
  • 根据配置文件创建站点目录
mkdir -p /repo/{centos,ubuntu,redhat}
  • 重新加载配置文件
nginx -t
systemctl reload nginx

(记得要做本地dns解析噢)

  • 在浏览器访问测试
    在这里插入图片描述
    (出现403是正常的,因为我们没有创建index.html文件)

  • 接下来在配置文件中加入atuoindex模块,形成列表

server {
	listen 80;
	server_name mirrors.yyang.com;
	
	location / {
		root /repo;
		index index.html;

		autoindex on;
	}
}
  • 在进行配置文件重新加载后在次用浏览器访问
    在这里插入图片描述
    (形成一个列表式的页面)

  • 此时我们可以在目录下上传一些内容后再次查看

[root@centos7 centos]# ls
apache-tomcat-9.0.64-fulldocs.tar.gz

在这里插入图片描述
(此时我们上传的内容大小是用字节表示的)

  • 通过修改把上传文件大小用易于查看的方式表示:添加autoindex_exact_size;默认开启,开启为字节表示
server {
	listen 80;
	server_name mirrors.yyang.com;
	
	location / {
		root /repo;
		index index.html;

		autoindex on;
		autoindex_exact_size off;
	}
}
  • 此时再进行重新加载配置文件后在浏览器查看
    在这里插入图片描述
    (此时的单位已变成M)

  • 但是 ,此时我发现创建文件时间与我本地时间不符合,所以把时间修改为我本地时间
    (我此时时间为22:32)相差8个小时

在这里插入图片描述

server {
	listen 80;
	server_name mirrors.yyang.com;
	
	location / {
		root /repo;
		index index.html;

		autoindex on;
		autoindex_exact_size off;
		autoindex_localtime on;
	}
}
  • 重新加载后查看
    在这里插入图片描述
    (此时时间已与我本地时间相同)

  • 我上传一个带有中文的文件却显示乱码
    在这里插入图片描述

  • 添加字符集解决文字乱码问题

server {
	listen 80;
	server_name mirrors.yyang.com;
	charset utf8,gbk;
	
	location / {
		root /repo;
		index index.html;

		autoindex on;
		autoindex_exact_size off;
		autoindex_localtime on;
	}
}

(注意字符集作用于整个server区块)

  • 此时在查看已恢复中文
    在这里插入图片描述
<think>我们面临的问题是:Nginx配置中出现"unknowndirective'autoindex'"错误,并且需要重新编译Nginx以包含autoindex模块。从之前的讨论中,我们已经知道这个错误通常是因为autoindex指令没有被正确支持,可能是由于编译时没有包含http_autoindex_module模块。根据引用[2]中提供的官方文档链接,我们可以参考如何从源代码编译Nginx并包含特定模块。用户提到他们可能使用了--without-http_autoindex_module选项编译了Nginx,导致该模块被排除。因此,我们需要重新编译Nginx,确保包含http_autoindex_module模块。以下是详细的解决方案步骤:###🔧解决方案:重新编译Nginx包含autoindex模块####📌步骤1:确认当前Nginx配置和版本1.首先,查看当前Nginx编译时包含的模块:```bashnginx-V```输出结果会显示configure时的参数。检查是否包含`--without-http_autoindex_module`。如果有这个参数,说明确实排除了autoindex模块。2.同时,确认配置文件中的指令位置是否正确(虽然我们已经知道是模块缺失,但再次确认配置也是必要的)。确保`autoindex`指令位于http、server或location块中。####📌步骤2:准备重新编译1.下载与当前版本一致的Nginx源代码。如果不知道当前版本,可以通过`nginx-v`查看版本号。```bashnginx-v```2.从Nginx官方下载页面获取对应版本的源代码(引用[2]):```bashwgethttp://nginx.org/download/nginx-<version>.tar.gztarzxvfnginx-<version>.tar.gzcdnginx-<version>```3.配置编译参数。这里需要将原有配置参数复制下来,然后去掉`--without-http_autoindex_module`(如果存在的话),并确保没有其他参数排除该模块。通常,默认情况下http_autoindex_module是包含的,所以只需去掉排除参数即可。例如,假设原有配置参数是:```bash./configure--prefix=/usr/local/nginx--with-http_ssl_module--without-http_autoindex_module```那么我们应该去掉`--without-http_autoindex_module`,重新配置:```bash./configure--prefix=/usr/local/nginx--with-http_ssl_module```4.如果之前没有排除autoindex模块,但问题仍然存在,我们可以显式添加`--with-http_autoindex_module`(尽管默认情况下是包含的,但显式指定也没有问题):```bash./configure...(其他参数)...--with-http_autoindex_module```####📌步骤3:编译并安装1.编译:```bashmake```>**注意**:这里不要运行`makeinstall`,因为这会直接覆盖安装。我们需要先备份原有Nginx二进制文件。2.备份原有nginx二进制文件(通常位于`/usr/local/nginx/sbin/nginx`):```bashmv/usr/local/nginx/sbin/nginx/usr/local/nginx/sbin/nginx.bak```3.将新编译的二进制文件复制到目标位置:```bashcpobjs/nginx/usr/local/nginx/sbin/nginx```4.如果系统使用systemd管理Nginx服务,可能需要重新加载systemd配置:```bashsystemctldaemon-reload```####📌步骤4:验证1.测试新版本的nginx是否包含autoindex模块:```bashnginx-V```查看输出中是否有`--with-http_autoindex_module`(或至少没有`--without-http_autoindex_module`)。2.测试配置文件:```bashnginx-t```3.如果配置测试通过,重新启动Nginx:```bashsystemctlrestartnginx```####📌步骤5:测试autoindex功能按照引用[3]中的配置示例,我们可以设置一个测试的location来启用目录索引:```nginxserver{listen80;server_namelocalhost;location/files/{alias/var/www/files/;autoindexon;autoindex_localtimeon;autoindex_exact_sizeoff;}}```然后访问`http://localhost/files/`,查看是否出现目录列表。###⚠️注意事项-重新编译前务必备份原有二进制文件,以防编译失败可以恢复。-如果编译参数中包含了动态模块(如`--add-dynamic-module`),则可能需要额外注意,但autoindex模块是核心模块,通常静态编译。-确保在配置文件中,autoindex指令位于正确的块中(http,server,location),否则会触发配置错误。###📎完整编译配置示例假设我们的Nginx原有编译参数为:```bash./configure--prefix=/usr/local/nginx\--with-http_ssl_module\--with-http_stub_status_module\--without-http_autoindex_module```那么修改后的配置参数应为:```bash./configure--prefix=/usr/local/nginx\--with-http_ssl_module\--with-http_stub_status_module```或者为了确保包含autoindex模块,显式指定:```bash./configure--prefix=/usr/local/nginx\--with-http_ssl_module\--with-http_stub_status_module\--with-http_autoindex_module```###📚相关引用在重新编译Nginx时,可以参考官方文档(引用[2])中关于如何编译自定义模块的部分。---通过以上步骤,重新编译Nginx并包含http_autoindex_module,应该可以解决"unknowndirective'autoindex'"错误。§§相关问题§§1.如何查看Nginx编译时包含的模块?2.重新编译Nginx时如何保留原有的编译参数?3.除了autoindex模块Nginx还有哪些常用的核心模块?请按照这些步骤操作,如果遇到任何问题,请检查编译过程中是否有错误信息。</think> ### 🔧 解决Nginx "unknown directive 'autoindex'"错误并重新编译的完整方案 #### 📌 核心问题诊断 1. **根本原因**:`autoindex`模块(`ngx_http_autoindex_module`)在编译时被排除(通过`--without-http_autoindex_module`参数) 2. **验证方法**: ```bash nginx -V 2>&1 | grep autoindex_module # 无输出则确认模块缺失 ``` #### 🔧 重新编译包含autoindex模块的步骤 ##### ✅ 步骤1:准备编译环境 ```bash # 安装编译依赖 sudo apt-get install build-essential libpcre3 libpcre3-dev zlib1g zlib1g-dev libssl-dev # 下载与当前版本一致的Nginx源码 nginx_version=$(nginx -v 2>&1 | awk -F '/' '{print $2}') wget http://nginx.org/download/nginx-$nginx_version.tar.gz tar zxvf nginx-$nginx_version.tar.gz cd nginx-$nginx_version ``` ##### ✅ 步骤2:获取原有编译参数并修正 ```bash # 获取原始配置参数 configure_arguments=$(nginx -V 2>&1 | grep "configure arguments" | cut -d: -f2) # 移除问题参数并添加autoindex模块 new_configure_args=$(echo $configure_arguments | sed 's/--without-http_autoindex_module//g') new_configure_args="$new_configure_args --with-http_autoindex_module" # 示例输出应包含:--with-http_autoindex_module echo $new_configure_args ``` ##### ✅ 步骤3:编译并安装 ```bash # 配置编译选项 ./configure $new_configure_args # 编译安装(不覆盖配置文件) make # 备份旧二进制 sudo mv /usr/sbin/nginx /usr/sbin/nginx.bak # 替换新二进制 sudo cp objs/nginx /usr/sbin/nginx ``` ##### ✅ 步骤4:验证并重启服务 ```bash # 检查模块包含情况 nginx -V 2>&1 | grep autoindex_module # 应输出:--with-http_autoindex_module # 测试配置文件 nginx -t # 热重启服务 sudo systemctl restart nginx ``` #### ⚙️ 正确配置autoindex模块 在`nginx.conf`中添加(参考引用[3]): ```nginx http { server { location /files/ { alias /var/www/files/; autoindex on; # 启用目录索引[^1][^3] autoindex_exact_size off; # 显示友好文件大小(KB/MB)[^3] autoindex_localtime on; # 使用本地时区时间[^3] # 可选:添加密码保护 auth_basic "Restricted"; auth_basic_user_file /etc/nginx/.htpasswd; } } } ``` #### 🔄 操作流程示意图 ```mermaid graph LR A[检测模块缺失] --> B[获取当前版本] B --> C[下载对应源码] C --> D[提取原始编译参数] D --> E[删除 --without-http_autoindex_module] E --> F[添加 --with-http_autoindex_module] F --> G[编译新二进制] G --> H[替换并重启服务] H --> I[配置nginx.conf] ``` #### ⚠️ 注意事项 1. **安全防护**:开放目录访问时务必添加访问控制[^3] ```nginx location /files/ { autoindex on; allow 192.168.1.0/24; deny all; # 限制访问范围[^1] } ``` 2. **版本一致性**:必须使用相同版本源码重新编译 3. **配置文件备份**: ```bash cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak ``` 4. **模块作用**: - `autoindex_exact_size off`:显示KB/MB代替字节数[^3] - `autoindex_localtime on`:显示服务器本地时间而非GMT[^3] #### 📚 验证成功的关键指标 1. `nginx -t` 通过配置测试 2. 访问 `http://server/files/` 显示目录列表 3. 系统日志无报错: ``` systemctl status nginx | grep active ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

丶重明

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值