Nginx将静态文件/目录列出为XML / Json

Tia*_*ira 3 xml webserver json nginx

我安装nginx的目的是提供照片和视频之类的静态文件,并能够以编程方式列出所提供的文件。

问题是该清单是在HTML页面中完成的,对于我的应用程序,我需要能够处理该清单(例如json或xml)。

无论如何,我可以使用Nginx做到这一点吗?(或者是否有其他替代方法可以解决我的问题)

提前致谢。

wir*_*res 5

从1.7.9版开始,您可以使用autoindex_formatset jsonxml,请参考此处的文档

location / {
    ...
    autoindex on;
    autoindex_format json;
}
Run Code Online (Sandbox Code Playgroud)


Git*_*LAB 5

自版本 1.7.9(2014 年 12 月 23 日发布)以来, NGINX 中包含的ngx_http_autoindex_module模块(为以斜杠字符结尾的请求生成目录列表:)添加了一个设置目录列表格式指令/autoindex_format

语法: 默认: ; 语境:autoindex_formathtml | xml | json | jsonp;
autoindex_format html
http, server, location

启用此功能的 示例配置(对于 JSON):

location / {
    autoindex on;
    autoindex_format json;
}
Run Code Online (Sandbox Code Playgroud)

当使用 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
Run Code Online (Sandbox Code Playgroud)

"name""mtime"和应该是不言自明的"type":"directory"重要的是要注意,该字段仅存在 IFF ,否则将完全省略(参见下面的示例)! "type":"file"
"size""type":"file"

"type":"other"值得进一步解释:
假设您做了一些在生产中从未做过的事情,并'root /;'在 Linux 系统上的配置中进行设置,然后进行索引/dev/,那么您将获得如下目录条目:

[
{ "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
]
Run Code Online (Sandbox Code Playgroud)

可能还有其他例子"type":"other",如果你知道一些,请留言!

特殊的点当前/点父级 ( ., ..)点文件/点文件夹 ( .hidden) 在响应中被过滤(不存在)!
有趣的是:特殊的 dot-current/dot-parent ( ., ..) 可以通过您的客户端代码添加,就像ngx_http_autoindex_module将它们硬编码到默认的 html 格式响应中一样。


以下是两个原始“格式”的“原始”响应示例。
注意:响应行结尾被硬编码为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 }
]
Run Code Online (Sandbox Code Playgroud)

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 }
]);
Run Code Online (Sandbox Code Playgroud)



一个非常简单的片段,使用 JSONP 回调并构建一个 HTML 表,旨在明确地阐明格式:

<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>
Run Code Online (Sandbox Code Playgroud)

这意味着从这里开始您可以在客户端对结果进行过滤和排序。您还可以根据文件类型/扩展名等链接图标。
让它随心所欲,祝您好运!

一些额外的灵感可能会在以下方面找到:

资料来源: