我应该期待什么 NGINX autoindex_format JSON(P) 响应 fields/format?
What NGINX autoindex_format JSON(P) response fields/format should I expect?
NGINX ngx-http-autoindex-module
支持 autoindex_format
指令将自动索引响应从默认 html 页面更改为 xml、json 或 jsonp.
官方文档对这个主题非常简短,没有提供关于 JSON(P) 响应的进一步解释或规则。此外,google 仅提供了一些相关的搜索结果,其中 none 提供了更深入的见解甚至是简单的示例。
那么对于 json 和 jsonp,我应该在响应中期望哪些字段和值类型(甚至固定值)?
在使用响应和生成 html- 输出时,是否还有其他我应该了解的规则?
设置目录格式的ngx_http_autoindex_module Module (which produces a directory listing for requests ending with the slash character: /
) included in NGINX since version 1.7.9 (released 2014-12-23) added an autoindex_format
directive:
Syntax: autoindex_format
html | xml | json | jsonp;
Default: autoindex_format html
;
Context: http, server, location
示例 配置以启用此功能(对于 JSON):
location / {
autoindex on;
autoindex_format json;
}
当使用 JSONP 格式时,回调函数的名称用 callback
请求参数设置。 如果该参数缺失或具有空值,则返回 JSON 格式。
JSON(P)响应数据结构(方案)定义为:
callback( // when format directive jsonp AND callback argument in request
[ // a single one-dimensional Array (wrap) containing
{ // Objects representing directory entries, structured as:
"name" :"*" //String
, "type" :"directory"|"file"|"other" //String, ONLY 1 OF THESE 3
, "mtime":"Ddd, DD Mmm YYYY hh:mm:ss GMT" //String, RFC1123-date of HTTP-date defined by RFC2616
, "size" :* //Integer, ONLY PRESENT IFF "type":"file" !!!!!
} /*
, { // and repeating the above Object structure for each directory entry
} */
]
); // end callbackFunction-call when jsonp
"name"
、"mtime"
、"type":"directory"
和 "type":"file"
应该是不言自明的。
重要 注意 "size"
字段仅存在 IFF "type":"file"
,否则将完全省略(参见下面的示例)!!
"type":"other"
值得进一步解释:
假设您做了一些您 在生产 中永远不会做的事情,并在 linux 系统的配置中设置 'root /;'
并随后索引 /dev/
然后你' d 获取目录条目,如:
[
{ "name":"floppy", "type":"other", "mtime":"Mon, 23 Oct 2017 15:16:56 GMT" },
{ "name":"loop0", "type":"other", "mtime":"Mon, 23 Oct 2017 15:16:56 GMT" }
// and so forth
]
"type":"other"
可能还有其他示例,如果您知道一些,请发表评论!
特殊dot-current/dot-parent(.
,..
)和Dot-files/dot-folders(.hidden
)过滤(不存在)在响应中!
有趣:特殊的 dot-current/dot-parent (.
, ..
) 可以通过您的客户端代码添加,就像 ngx_http_autoindex_module
将它们硬编码为默认的 html 格式一样响应。
这里有两个 'raw' 响应 示例 在他们原来的 'formatting'.
注意: 响应行尾被硬编码为 CRLF
。
JSON(和 JSONP 无回调):
[
{ "name":"subdir", "type":"directory", "mtime":"Tue, 24 Oct 2017 16:16:16 GMT" },
{ "name":"image.jpg", "type":"file", "mtime":"Tue, 24 Oct 2017 16:16:39 GMT", "size":5 },
{ "name":"test.html", "type":"file", "mtime":"Tue, 24 Oct 2017 16:09:18 GMT", "size":5 }
]
JSONP(回调=foo):
注意:前导块评论是 JSONP 响应的一部分。
/* callback */
foo([
{ "name":"subdir", "type":"directory", "mtime":"Tue, 24 Oct 2017 16:16:16 GMT" },
{ "name":"image.jpg", "type":"file", "mtime":"Tue, 24 Oct 2017 16:16:39 GMT", "size":5 },
{ "name":"test.html", "type":"file", "mtime":"Tue, 24 Oct 2017 16:09:18 GMT", "size":5 }
]);
一个痛苦的简单片段使用 JSONP 回调并构建 HTML table 旨在明确阐明格式:
<script>
function foo(d){
var i= 0
, L= d.length
, r= '<table border="1" cellpadding="4px" style="border-collapse:collapse"><thead style="border-bottom:4px solid black">\n'
+ '<tr><th style="width:80%">Name</th><th>Type</th><th>Last Modified</th><th>Size</th></tr>\n'
+ '</thead><tbody>\n'
;
for(;i<L;++i)
r+= '<tr><td>' + d[i].name
+ '</td><td>' + d[i].type
+ '</td><td style="white-space: nowrap">' + d[i].mtime
+ '</td><td>' + (d[i].type==='file' ? d[i].size : '-')
+ '</td></tr>\n';
r+='</tbody></table>';
document.body.innerHTML=r;
}
</script>
<script> // JSONP Use your own preferred JSON(P) fetchmethod
/* callback */
foo([
{ "name":"subdir", "type":"directory", "mtime":"Tue, 24 Oct 2017 16:16:16 GMT" },
{ "name":"image.jpg", "type":"file", "mtime":"Tue, 24 Oct 2017 16:16:39 GMT", "size":5 },
{ "name":"test.html", "type":"file", "mtime":"Tue, 24 Oct 2017 16:09:18 GMT", "size":5 },
{ "name":"????", "type":"other", "mtime":"Tue, 24 Oct 2017 16:17:52 GMT" }
]);
</script>
一些额外的灵感可能来自于:
- nginx-autoindex-js(Nginx JSON 自动索引格式的 JavaScript 前端)
- 或pretty-autoindex
(目前有一个 'bug':它在 type=directory 时隐藏大小,而不是在 type!=file 时隐藏大小的正确行为)
来源:
- 来自用户 'benbrown' 的#nginx communitiy 支持 IRC 频道(在 freenode 上)的出色帮助,感谢您帮助我测试并指出 nginx 源代码的相关部分
- http://lxr.nginx.org/ident?_i=ngx_http_autoindex_json
- http://lxr.nginx.org/source/src/http/modules/ngx_http_autoindex_module.c#0693
- 官方单元测试:
https://trac.nginx.org/nginx/browser/nginx-tests/autoindex_format.t
NGINX ngx-http-autoindex-module
支持 autoindex_format
指令将自动索引响应从默认 html 页面更改为 xml、json 或 jsonp.
官方文档对这个主题非常简短,没有提供关于 JSON(P) 响应的进一步解释或规则。此外,google 仅提供了一些相关的搜索结果,其中 none 提供了更深入的见解甚至是简单的示例。
那么对于 json 和 jsonp,我应该在响应中期望哪些字段和值类型(甚至固定值)?
在使用响应和生成 html- 输出时,是否还有其他我应该了解的规则?
设置目录格式的ngx_http_autoindex_module Module (which produces a directory listing for requests ending with the slash character: /
) included in NGINX since version 1.7.9 (released 2014-12-23) added an autoindex_format
directive:
Syntax:
autoindex_format
html | xml | json | jsonp;
Default:autoindex_format html
;
Context:http, server, location
示例 配置以启用此功能(对于 JSON):
location / {
autoindex on;
autoindex_format json;
}
当使用 JSONP 格式时,回调函数的名称用 callback
请求参数设置。 如果该参数缺失或具有空值,则返回 JSON 格式。
JSON(P)响应数据结构(方案)定义为:
callback( // when format directive jsonp AND callback argument in request
[ // a single one-dimensional Array (wrap) containing
{ // Objects representing directory entries, structured as:
"name" :"*" //String
, "type" :"directory"|"file"|"other" //String, ONLY 1 OF THESE 3
, "mtime":"Ddd, DD Mmm YYYY hh:mm:ss GMT" //String, RFC1123-date of HTTP-date defined by RFC2616
, "size" :* //Integer, ONLY PRESENT IFF "type":"file" !!!!!
} /*
, { // and repeating the above Object structure for each directory entry
} */
]
); // end callbackFunction-call when jsonp
"name"
、"mtime"
、"type":"directory"
和 "type":"file"
应该是不言自明的。
重要 注意 "size"
字段仅存在 IFF "type":"file"
,否则将完全省略(参见下面的示例)!!
"type":"other"
值得进一步解释:
假设您做了一些您 在生产 中永远不会做的事情,并在 linux 系统的配置中设置 'root /;'
并随后索引 /dev/
然后你' d 获取目录条目,如:
[
{ "name":"floppy", "type":"other", "mtime":"Mon, 23 Oct 2017 15:16:56 GMT" },
{ "name":"loop0", "type":"other", "mtime":"Mon, 23 Oct 2017 15:16:56 GMT" }
// and so forth
]
"type":"other"
可能还有其他示例,如果您知道一些,请发表评论!
特殊dot-current/dot-parent(.
,..
)和Dot-files/dot-folders(.hidden
)过滤(不存在)在响应中!
有趣:特殊的 dot-current/dot-parent (.
, ..
) 可以通过您的客户端代码添加,就像 ngx_http_autoindex_module
将它们硬编码为默认的 html 格式一样响应。
这里有两个 'raw' 响应 示例 在他们原来的 'formatting'.
注意: 响应行尾被硬编码为 CRLF
。
JSON(和 JSONP 无回调):
[
{ "name":"subdir", "type":"directory", "mtime":"Tue, 24 Oct 2017 16:16:16 GMT" },
{ "name":"image.jpg", "type":"file", "mtime":"Tue, 24 Oct 2017 16:16:39 GMT", "size":5 },
{ "name":"test.html", "type":"file", "mtime":"Tue, 24 Oct 2017 16:09:18 GMT", "size":5 }
]
JSONP(回调=foo):
注意:前导块评论是 JSONP 响应的一部分。
/* callback */
foo([
{ "name":"subdir", "type":"directory", "mtime":"Tue, 24 Oct 2017 16:16:16 GMT" },
{ "name":"image.jpg", "type":"file", "mtime":"Tue, 24 Oct 2017 16:16:39 GMT", "size":5 },
{ "name":"test.html", "type":"file", "mtime":"Tue, 24 Oct 2017 16:09:18 GMT", "size":5 }
]);
一个痛苦的简单片段使用 JSONP 回调并构建 HTML table 旨在明确阐明格式:
<script>
function foo(d){
var i= 0
, L= d.length
, r= '<table border="1" cellpadding="4px" style="border-collapse:collapse"><thead style="border-bottom:4px solid black">\n'
+ '<tr><th style="width:80%">Name</th><th>Type</th><th>Last Modified</th><th>Size</th></tr>\n'
+ '</thead><tbody>\n'
;
for(;i<L;++i)
r+= '<tr><td>' + d[i].name
+ '</td><td>' + d[i].type
+ '</td><td style="white-space: nowrap">' + d[i].mtime
+ '</td><td>' + (d[i].type==='file' ? d[i].size : '-')
+ '</td></tr>\n';
r+='</tbody></table>';
document.body.innerHTML=r;
}
</script>
<script> // JSONP Use your own preferred JSON(P) fetchmethod
/* callback */
foo([
{ "name":"subdir", "type":"directory", "mtime":"Tue, 24 Oct 2017 16:16:16 GMT" },
{ "name":"image.jpg", "type":"file", "mtime":"Tue, 24 Oct 2017 16:16:39 GMT", "size":5 },
{ "name":"test.html", "type":"file", "mtime":"Tue, 24 Oct 2017 16:09:18 GMT", "size":5 },
{ "name":"????", "type":"other", "mtime":"Tue, 24 Oct 2017 16:17:52 GMT" }
]);
</script>
一些额外的灵感可能来自于:
- nginx-autoindex-js(Nginx JSON 自动索引格式的 JavaScript 前端)
- 或pretty-autoindex
(目前有一个 'bug':它在 type=directory 时隐藏大小,而不是在 type!=file 时隐藏大小的正确行为)
来源:
- 来自用户 'benbrown' 的#nginx communitiy 支持 IRC 频道(在 freenode 上)的出色帮助,感谢您帮助我测试并指出 nginx 源代码的相关部分
- http://lxr.nginx.org/ident?_i=ngx_http_autoindex_json
- http://lxr.nginx.org/source/src/http/modules/ngx_http_autoindex_module.c#0693
- 官方单元测试: https://trac.nginx.org/nginx/browser/nginx-tests/autoindex_format.t