Apache2 – Как выполнить CGI-скрипт с расширением файла .json?

Вопрос или проблема

ПРОБЛЕМА

У меня есть сервер Apache2 со скриптами в /cgi-bin/, работающими на различных языках. Похоже, что он сейчас работает для любого расширения файла… кроме .json. Файлы .json не работают, возвращая ошибку сервера 500.

Я хотел бы, чтобы файлы *.json в cgi-bin выполнялись как CGI.

Почему Apache, кажется, обрабатывает этот тип файла иначе? Нет .htaccess файлов, и нет специальной конфигурации в конфигурационных файлах sites-available для CGI, кроме строки ScriptAlias, которая связывает /cgi-bin/ с его локальным каталогом, хотя я пробовал вручную указывать расширение .json как в .htaccess, так и в sites-available, используя все варианты и примеры, как ниже:

Options +ExecCGI
SetHandler cgi-script
AddHandler cgi-script .cgi .php .pl .py .ssjs .js .json

Чтобы продемонстрировать проблему, я написал тестовый скрипт CGI на Node-JS и скопировал его в различные типы файлов, все в каталоге /cgi-bin/, затем написал короткий доказательный скрипт, чтобы вызвать каждый из тестовых скриптов и отобразить результаты из консоли js в Chrome DevTools.

Скрипт на Node-JS, как и скрипт на Python, работает во всех случаях, кроме когда расширение файла .json.

Ниже приведены результаты, а также соответствующие данные, включая списки файлов, CGI скрипт и скрипт на стороне клиента, который вызывает их все (через fetch).

CGI скрипт выполняется нормально со всеми расширениями файлов, которые я пробовал, даже с вымышленными.

Но если я добавлю расширение .json, он не работает с ошибкой сервера 500, до вывода заголовков сервера, согласно журналу ошибок Apache.

Как видно ниже, все CGI файлы выполняются и возвращают ожидаемые данные, включая тип файла “.blarg”, и скрипт на Python только для демонстрации нормальной работы CGI.

Только скрипт на Python отличается. Все остальные файлы — это точные копии одного и того же скрипта, одинакового размера, с одинаковыми разрешениями, одинаковым владельцем, одинаковой группой, одинаковым всем.

Единственная разница — расширение файла. Но это происходит независимо от содержимого скрипта.

Так почему Apache по-другому обрабатывает файлы *.json?

ПРОВЕРКА ТЕСТА (скрипт DevTools на стороне клиента)

let list = (`date.blarg, date.js, date.json, date.njs, date.nodejs, date.ssjs, hello.py`).split(`, `);

let files = list.length;

for( var item in list ){
  list[item] = [
    list[ item ],
    await fetch(`/cgi-bin/${ list[item] }`).then( data => data.text() )
  ];
}

console.log( await list );

CGI СКРИПТ

#!/usr/bin/env node

console.log(`Content-type: text/json\n\n${  JSON.stringify(
  {
    filename: process.env['REQUEST_URI'].split("https://serverfault.com/")[2],
    timestamp: new Date()
  }
)  }`);

СПИСОК ФАЙЛОВ

-rwxr-xr-x 1 user user       180 Jan  9 04:38  date.blarg*
-rwxr-xr-x 1 user user       180 Jan  9 04:38  date.js*
-rwxr-xr-x 1 user user       180 Jan  9 04:38  date.json*
-rwxr-xr-x 1 user user       180 Jan  9 04:38  date.njs*
-rwxr-xr-x 1 user user       180 Jan  9 04:38  date.nodejs*
-rwxr-xr-x 1 user user       180 Jan  9 04:38  date.ssjs*

РЕЗУЛЬТАТЫ ТЕСТА:

[
    [
        "date.blarg",
        "{\"filename\":\"date.blarg\",\"timestamp\":\"2025-01-09T12:46:04.943Z\"}\n"
    ],
    [
        "date.js",
        "{\"filename\":\"date.js\",\"timestamp\":\"2025-01-09T12:46:05.057Z\"}\n"
    ],
    [
        "date.json",
        "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\n<html><head>\n<title>500 Internal Server Error</title>\n</head><body>\n<h1>Internal Server Error</h1>\n<p>The server encountered an internal error or\nmisconfiguration and was unable to complete\nyour request.</p>\n<p>Please contact the server administrator at \n [no address given] to inform them of the time this error occurred,\n and the actions you performed just before this error.</p>\n<p>More information about this error may be available\nin the server error log.</p>\n</body></html>\n"
    ],
    [
        "date.njs",
        "{\"filename\":\"date.njs\",\"timestamp\":\"2025-01-09T12:46:05.300Z\"}\n"
    ],
    [
        "date.nodejs",
        "{\"filename\":\"date.nodejs\",\"timestamp\":\"2025-01-09T12:46:05.416Z\"}\n"
    ],
    [
        "date.ssjs",
        "{\"filename\":\"date.ssjs\",\"timestamp\":\"2025-01-09T12:46:05.539Z\"}\n"
    ],
    [
        "hello.py",
        "Hello, world!\n"
    ]
]

ЗАПИСЬ В ЖУРНАЛЕ ОШИБОК APACHE2

[Thu Jan 09 04:34:23.972051 2025] [cgid:error] [pid 162837] [client x.x.x.x:25267] End of script output before headers: date.json

Ответ или решение

РЕШЕНИЕ ПРОБЛЕМЫ С ИСПОЛНЕНИЕМ CGI-СКРИПТОВ С РАСШИРЕНИЕМ .JSON В APACHE2

Вам нужна возможность исполнять скрипты в каталоге /cgi-bin/ с расширением .json, однако вы сталкиваетесь с ошибкой 500, когда пытаетесь запустить такие скрипты на сервере Apache2. Давайте разберем возможные причины и решения данной проблемы.

1. Проблемы с конфигурацией Apache

Apache может обрабатывать файлы с расширением .json по-другому из-за его настроек.

  • Проверьте конфигурацию Apache: Откройте конфигурационный файл вашего сайта в sites-available и убедитесь, что вы корректно задали обработку .json-файлов. Ваши текущие инструкции, такие как:

    Options +ExecCGI
    SetHandler cgi-script
    AddHandler cgi-script .cgi .php .pl .py .ssjs .js .json

    должны быть добавлены в контексте правильной директории, что позволит Apache обрабатывать файлы с данным расширением как скрипты.

  • Модуль mod_mime: Убедитесь, что модуль mod_mime загружается, так как он обрабатывает расширения файлов.

2. Ошибка “End of script output before headers”

Эта ошибка возникает, когда есть проблема на уровне скрипта, который не правильно генерирует или не предоставляет все необходимые HTTP-заголовки.

  • Проверьте заголовки: Убедитесь, что ваш скрипт корректно выводит заголовки перед основным содержимым. Минимальный набор включает заголовок типа содержимого:

    console.log("Content-type: application/json\n\n");
  • Проверка ошибок: Включите отображение ошибок в вашем Node.js скрипте, чтобы отследить возможные проблемы.

3. Права доступа и окружение

  • Права на выполнение: Убедитесь, что файлы имеют права на выполнение. Команда chmod +x filename должна быть применена к вашим скриптам.

  • Используемая среда: Убедитесь, что используемая среда (например, Node.js) корректно настроена и доступна в путях выполнения Apache.

4. Логирование и отладка

  • Логи Apache: Проверьте логи серверных ошибок более тщательно. Возможно, там есть другая информация, указывающая на проблемные места.

  • Логи скриптов: Добавьте запись логов в ваши скрипты, чтобы вы могли отследить точки отказа.

Вывод

Ваша проблема требует внимательного анализа конфигурации и работы скриптов. Убедитесь, что настроены правильные обработчики в Apache, скрипты генерируют необходимые заголовки, и что окружение исполнения корректно настроено. Эти действия помогут устранить 500 серверную ошибку и позволят вам исполнять CGI-скрипты с расширением .json.

Оцените материал
Добавить комментарий

Капча загружается...