设计新博客时想利用nginx的目录输出功能,makedown渲染在前端。配置好nginx后发现默认的时间格式是Wed, 31 Dec 1986 10:00:00 GMT
,看着很是难受,在网上搜索也搜索不到解决办法,于是研究魔改代码解决。
控制目录输出的模块是ngx_http_autoindex_module.c
,然后就魔改这个文件。查看官方文档得知这个模块有四个模式:html | xml | json | jsonp
,分别对应ngx_http_autoindex_module.c
文件内的ngx_http_autoindex_html
、ngx_http_autoindex_json
、ngx_http_autoindex_jsonp_callback
、ngx_http_autoindex_xml
这几个函数,其中xml的函数就是很好的事例,915行应该就是定义时间格式的位置:
xxxxxxxxxx
41b->last = ngx_sprintf(b->last, "%4d-%02d-%02dT%02d:%02d:%02dZ",
2tm.ngx_tm_year, tm.ngx_tm_mon,
3tm.ngx_tm_mday, tm.ngx_tm_hour,
4tm.ngx_tm_min, tm.ngx_tm_sec);
将这段代码复制到html部分中630行处,并且将462行的静态变量掉:
xxxxxxxxxx
141b->last = ngx_sprintf(b->last, "%02d-%s-%d %02d:%02d ",
2tm.ngx_tm_mday,
3months[tm.ngx_tm_mon - 1],
4tm.ngx_tm_year,
5tm.ngx_tm_hour,
6tm.ngx_tm_min);
7----上面是修改前,下面是修改后
8b->last = ngx_sprintf(b->last, "%4d-%02d-%02dT%02d:%02d:%02dZ",
9tm.ngx_tm_year, tm.ngx_tm_mon,
10tm.ngx_tm_mday, tm.ngx_tm_hour,
11tm.ngx_tm_min, tm.ngx_tm_sec);
12----下面部分注释掉,在大概462行
13static char *months[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun",
14"Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
如果462行的静态变量不注释的话在编译时会报静态变量未引用错误。
至此html部分魔改完毕,html的魔改还是很简单的,由此甚至可以对网页的格式做调整,原来是由空格调整,导致有中文是会错位,有时间打算将其改写为列表。
json的魔改就麻烦很多,由于语法有很多看不懂的地方,可能存在更好的解决办法,不过不影响魔改。
首先找到是哪条语句控制时间格式,联系上下文应该是第784行,如下:
xxxxxxxxxx
11b->last = ngx_http_time(b->last, entry[i].mtime);
entry数组应该是从函数外传入的,所以不好修改,所以准备按照格式xml的方式修改,不管如何先把上面注释掉。
在注释掉代码的位置添加以下内容:
xxxxxxxxxx
51ngx_gmtime(entry[i].mtime + tp->gmtoff * 60 * alcf->localtime, &tm);
2b->last = ngx_sprintf(b->last, "%4d-%02d-%02dT%02d:%02d:%02dZ",
3tm.ngx_tm_year, tm.ngx_tm_mon,
4tm.ngx_tm_mday, tm.ngx_tm_hour,
5tm.ngx_tm_min, tm.ngx_tm_sec);
然后编译报错发现有很多东西没定义,然后再添加一些东西:
xxxxxxxxxx
271ngx_http_autoindex_json(ngx_http_request_t *r, ngx_array_t *entries,
2ngx_str_t *callback)
3{
4size_t len, entry_len;
5ngx_buf_t *b;
6ngx_uint_t i;
7ngx_http_autoindex_entry_t *entry;
8----在函数开始的地方添加一些东西
9ngx_http_autoindex_json(ngx_http_request_t *r, ngx_array_t *entries,
10ngx_str_t *callback)
11{
12size_t len, entry_len;
13ngx_tm_t tm;//后添加的
14ngx_buf_t *b;
15ngx_uint_t i;
16ngx_time_t *tp;//后添加的
17ngx_http_autoindex_entry_t *entry;
18ngx_http_autoindex_loc_conf_t *alcf;//后添加的
19---------
20*b->last++ = '[';
21
22for (i = 0; i < entries->nelts; i++) {
23----上面是添加前,下面是添加后,位置是在755行位置处添加
24*b->last++ = '[';
25tp = ngx_timeofday();
26alcf = ngx_http_get_module_loc_conf(r, ngx_http_autoindex_module);
27for (i = 0; i < entries->nelts; i++) {
魔改后重新编译,结果如下:
xxxxxxxxxx
171[
2{ "name":"flowchart", "type":"directory", "mtime":"2021-03-03T09:16:49Z" },
3{ "name":"layuiAdmin", "type":"directory", "mtime":"2020-11-21T07:56:48Z" },
4{ "name":"layuimini-2-onepage", "type":"directory", "mtime":"2021-02-04T17:10:27Z" },
5{ "name":"source", "type":"directory", "mtime":"2019-08-09T15:39:52Z" },
6{ "name":"static", "type":"directory", "mtime":"2021-02-04T17:19:32Z" },
7{ "name":"test", "type":"directory", "mtime":"2021-03-08T09:04:00Z" },
8{ "name":"unlock-music", "type":"directory", "mtime":"2021-01-26T14:24:38Z" },
9{ "name":"教程文档", "type":"directory", "mtime":"2021-02-04T14:57:14Z" },
10{ "name":"layui.html", "type":"file", "mtime":"2021-02-05T14:00:01Z", "size":3486 },
11{ "name":"map.html", "type":"file", "mtime":"2020-09-03T16:23:54Z", "size":2767 },
12{ "name":"post.html", "type":"file", "mtime":"2021-01-29T16:16:04Z", "size":999 },
13{ "name":"post.json", "type":"file", "mtime":"2021-03-07T14:26:39Z", "size":38 },
14{ "name":"test.html", "type":"file", "mtime":"2021-03-08T08:58:53Z", "size":1867 },
15{ "name":"tmp.html", "type":"file", "mtime":"2021-02-04T16:20:26Z", "size":11966 },
16{ "name":"账本.html", "type":"file", "mtime":"2021-02-18T12:48:52Z", "size":90 }
17]
如果有需求的话时间格式还可以调整比如说把T和Z去掉,重新编译比较麻烦,就不演示了