Сценарий Apache cgi вызывается из браузера, но не встроенного устройства - PullRequest
0 голосов
/ 24 января 2019

Я работаю над проектом, который включает в себя два встроенных устройства, назовем их A и B. Устройство A - это контроллер, а B контролируется.Моя цель - создать эмулятор для устройства B, то есть нечто, действующее как B, так что A думает, что контролирует B, но на самом деле это мой собственный эмулятор.Я не контролирую или не могу изменить A.

Управление происходит через контроллер, отправляющий команды GET, вызывающие различные сценарии cgi, поэтому планируется установить apache на «моём» устройстве, настроить CGI и реплицировать различные сценарии.Я использую Apache версии 2.4.18 в Ubuntu 16.04.5 и настроил Apache2, чтобы он успешно запускал различные сценарии в зависимости от URL.Например, один из сценариев называется man_session, а типичный URL-адрес, выданный устройством A, выглядит следующим образом: http://192.168.0.14/cgi-bin/man_session?command=get&page=122

Я создал программу на C / C ++ с именем man_session и успешно настроил ее.Apache для вызова моего скрипта при отправке этого URL.Я могу видеть это на основе журнала apache:

192.168.0.2 - - [24/Jan/2019:14:38:38 +0000] "GET /cgi-bin/man_session?command=get&page=122 HTTP/1.1" 200 206 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36"

Кроме того, мой скрипт записывает в stderr, и я вижу вывод в файле журнала:

[Thu Jan 24 14:46:10.850123 2019] [cgi:error] [pid 23346:tid 4071617584] [client 192.168.0.2:62339] AH01215: Received man_session command 'command=get&page=122': /home/pi/cgi-bin/man_session

Пока все хорошо,У меня проблема в том, что скрипт не вызывается, когда устройство A делает запрос, только когда я делаю запрос через браузер (работает как Chrome, так и Internet Explorer) или curl.Браузеры работают на моем ПК с Windows, и curl запускается на самом встроенном устройстве "B".

Когда я включаю устройство A, я вижу активность URL в журнале, но сценарий не вызывается.Ниже приведена запись в журнале, показывающая URL, но не вызывающая сценарий «man_session».Он показывает код 400, который согласно спецификации HTTP является ошибкой «из-за неправильного синтаксиса».Другими отличиями являются отсутствующая информация о реферере и пользовательском агенте, а также http 1.0 против http 1.1, но я не понимаю, почему это имело бы значение.

192.168.0.9 - - [24/Jan/2019:14:38:12 +0000] "GET /cgi-bin/man_session?command=get&page=7 HTTP/1.0" 400 0 "-" "-"

Обратите внимание, что устройство A - 192.168.0.9, а мой компьютер -192.168.0.2.Что мне здесь не хватает, почему вышеупомянутый URL не вызывает скрипт, как при его выдаче браузером?Есть ли место, где я могу получить больше информации о том, почему код 400 происходит в этом случае?

1 Ответ

0 голосов
/ 26 января 2019

После долгих перемоток я наконец-то понял проблему. Предпринятые шаги:

  1. Увеличен уровень журнала для отладки (вместо значения по умолчанию 'warn' в apache2.conf
  2. Это вызвало появление следующего сообщения об ошибке в журнале

[Сб 26 января 02: 47: 56.974353 2019] [core: debug] [pid 15603: tid 4109366320] vhost.c (794): [клиент 192.168.0.9:61001] AH02415: [строгое] Неверное имя хоста ' 192.168.000.014'

  1. После небольшого исследования добавили следующую строку в файл apache2.conf

    HttpProtocolOptions Unsafe

Это исправлено, и сценарии теперь называются, как и ожидалось.

...