我应该期待什么 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_formathtml | 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 时隐藏大小的正确行为)

来源: