Nginx перечисляет статические файлы / каталоги в формате XML / Json

#xml #json #nginx #webserver

#xml #json #nginx #веб-сервер

Вопрос:

Я установил nginx с намерением обслуживать статические файлы, такие как фотографии и видео, имея возможность программно перечислять обслуживаемые файлы.

Проблема в том, что этот список выполняется на странице HTML, и для моего приложения мне нужно было иметь возможность обрабатывать этот список (что-то вроде json или xml).

Могу ли я в любом случае сделать это с помощью nginx? (Или есть какие-либо другие альтернативы, которые решают мою проблему)

Заранее спасибо.

Комментарии:

1. Для этого есть несколько пользовательских модулей nginx.

2. Разве вы ничего не знаете по памяти? Я искал в сторонних модулях и не нашел ни одного.

Ответ №1:

Начиная с версии 1.7.9, вы можете использовать autoindex_format значение json или xml , обратитесь к документации здесь .

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

Ответ №2:

Модуль ngx_http_autoindex_module (который создает список каталогов для запросов, заканчивающихся символом косой черты: / ), включенный в NGINX с версии 1.7.9 (выпущен 2014-12-23), добавил autoindex_format директиву, которая задает формат списка каталогов:

Синтаксис: 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" заслуживает некоторого дополнительного объяснения:
предположим, вы сделали что-то, чего никогда не делали бы в рабочей среде, и установили '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
]
  

Могут быть и другие примеры "type":"other" , если вы знаете некоторые, пожалуйста, оставьте комментарий!

Специальные точечные текущие / точечные родительские ( . , .. ) и точечные файлы / точечные папки ( .hidden ) фильтруются (отсутствуют) в ответе!
Интересно: специальный точечный текущий / точечный родительский ( . , .. ) может быть добавлен вашим клиентским кодом, точно так же, как 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 }
]
  

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, предназначенную для однозначного уточнения формата:

 <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 (интерфейс JavaScript для формата Nginx JSON autoindex)
  • или довольно-автоиндекс
    (в настоящее время имеет «ошибку»: он скрывает размер при type=directory вместо правильного поведения скрытия размера при type!=file)

Источники:

Ответ №3:

Решена проблема путем добавления php-скрипта на сервер для перечисления файлов.