#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)
Источники:
- отличная помощь по IRC-каналу поддержки сообщества #nginx (на freenode) от пользователя benbrown, спасибо за помощь в тестировании и указание на соответствующие части исходного кода 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
Ответ №3:
Решена проблема путем добавления php-скрипта на сервер для перечисления файлов.