我刚刚安装了一个新的 Web 服务器 (Debian Buster、Apache、Dovecot、ISPConfig) 来替换旧的 Web 服务器。我的一个网站使用自定义请求标头 (通过 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 已启用。
答案1
回答我自己的问题:
正式来说,下划线在 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'};
给出我想要的价值观......