Назад | Перейти на главную страницу

Apache: нет настраиваемых заголовков в переменных среды

Я только что установил новый веб-сервер (Debian Buster, Apache, Dovecot, ISPConfig), чтобы заменить старый веб-сервер. На одном из моих веб-сайтов используются настраиваемые заголовки запросов (через Javascript) для передачи информации в сценарий Perl на сервере:

XMLHttp.open("POST", "http://myserver.com/bin/FileUpload.cgi", true);          
XMLHttp.setRequestHeader("Content-type", fileToUpload.type);
XMLHttp.setRequestHeader("X_UPLOAD_FILETYPE", fileToUpload.type);
XMLHttp.setRequestHeader("X_UPLOAD_FILENAME", fileToUpload.name);
XMLHttp.setRequestHeader("X_UPLOAD_USER", currentUser);
XMLHttp.send(fileToUpload);

На старом сервере я смог прочитать эти дополнительные настраиваемые заголовки из perl следующим образом:

$ft = $ENV{'HTTP_X_UPLOAD_FILETYPE'};
$fn = $ENV{'HTTP_X_UPLOAD_FILENAME'};
$uu = $ENV{'HTTP_X_UPLOAD_USER'};

На новом сервере это не работает. Проверка переменных среды показывает, что пользовательских заголовков не существует. Я предполагаю, что это настройка apache2? mod_headers включен.

Чтобы ответить на мой собственный вопрос:

Официально подчеркивания - недопустимые символы для использования в заголовках HTTP-запросов. Заголовки, содержащие недопустимые символы, игнорируются Apache. Так что вместо

XMLHttp.setRequestHeader("X_UPLOAD_FILETYPE", fileToUpload.type);
XMLHttp.setRequestHeader("X_UPLOAD_FILENAME", fileToUpload.name);
XMLHttp.setRequestHeader("X_UPLOAD_USER", currentUser);

Я должен отправить это:

XMLHttp.setRequestHeader("X-UPLOAD-FILETYPE", fileToUpload.type);
XMLHttp.setRequestHeader("X-UPLOAD-FILENAME", fileToUpload.name);
XMLHttp.setRequestHeader("X-UPLOAD-USER", currentUser);

Как ни странно, тире затем преобразуются в символы подчеркивания на стороне сервера. И я не знаю почему. Итак, читаем эти переменные среды:

$ft = $ENV{'HTTP-X-UPLOAD-FILETYPE'};
$fn = $ENV{'HTTP-X-UPLOAD-FILENAME'};
$uu = $ENV{'HTTP-X-UPLOAD-USER'};

дает пустые строки, а эти переменные среды:

$ft = $ENV{'HTTP_X_UPLOAD_FILETYPE'};
$fn = $ENV{'HTTP_X_UPLOAD_FILENAME'};
$uu = $ENV{'HTTP_X_UPLOAD_USER'};

дает значения, которые я после ...