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

时间:2014-06-24 12:50:14

标签: xml json nginx webserver

我安装了nginx,旨在提供照片和视频等静态文件,能够以编程方式列出所提供的文件。

问题是此列表是在HTML页面中完成的,对于我的应用程序,我需要能够处理此列表(类似于json或xml)。

无论如何我能用nginx做到这一点吗? (或者还有其他解决方案可以解决我的问题)

提前致谢。

3 个答案:

答案 0 :(得分:4)

从版本1.7.9开始,您可以将autoindex_format设置为jsonxml,请参阅the docs here

location / {
    ...
    autoindex on;
    autoindex_format json;
}

答案 1 :(得分:2)

自版本1.7.9(2014-12-23发布)以来NGINX 中包含的ngx_http_autoindex_module模块(生成以斜杠字符结尾的请求的目录列表:/)< / em>添加了autoindex_format directive 设置目录列表的格式

  

语法: autoindex_format html | xml | json | jsonp;
  默认值: autoindex_format html;
  上下文: 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/然后您获取目录 - 例如:

[
{ "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"还有其他例子,如果你知道的话,请发表评论!

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


这是两个&#39; raw&#39;回复示例的原始&#39;格式&#39; 注意:响应行结尾被硬编码为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表,旨在明确地阐明格式:

&#13;
&#13;
<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>
&#13;
&#13;
&#13;

这意味着从这里开始,您可以对客户端的结果进行过滤和排序。您也可以根据文件类型/扩展名等链接图标。
让它像你一样疯狂,祝你好运!

可以在以下网站找到一些额外的灵感:

  • nginx-autoindex-js(Nginx JSON自动索引格式的JavaScript前端)
  • pretty-autoindex
    (目前有一个'bug':当type = =时隐藏大小,而不是在键入!= file时隐藏大小的正确行为)

来源:

答案 2 :(得分:0)

通过向服务器添加php脚本来列出文件来解决问题。