0

nginx version: nginx/1.7.9我在运行最新 OSX 的 Mac 上通过 macports安装了 nginx ( )。

我配置了一个 URI 来使用 SCGI:

location /server {
    include /Users/ruipacheco/Projects/Assorted/nginx/conf/scgi_params;
    scgi_pass unix:/var/tmp/rpc.sock;
    #scgi_pass 127.0.0.1:9000;
}

当我在 上执行 GET 请求时127.0.0.1/server,我在我的 SCGI 服务器上看到以下内容:

633:CONTENT_LENGTH0REQUEST_METHODGETREQUEST_URI/serverQUERY_STRINGCONTENT_TYPEDOCUMENT_URI/serverDOCUMENT_ROOT/opt/local/htmlSCGI1SERVER_PROTOCOLHTTP/1.1REMOTE_ADDR127.0.0.1REMOTE_PORT62088SERVER_PORT80SERVER_NAMElocalhostHTTP_HOST127.0.0.1HTTP_CONNECTIONkeep-aliveHTTP_CACHE_CONTROLmax-age=0HTTP_ACCEPTtext/html,application/xhtml+xml,application/xml;q=0.9,image/webp , / ;q=0.8HTTP_USER_AGENTMozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.115 Safari/537.36HTTP_DNT1HTTP_ACCEPT_ENCODINGgzip, deflate, sdchHTTP_ACCEPT_LANGUAGEen-US,en;q=0。文件的

问题是网络字符串的长度 633 与解释不匹配。如果我正确理解了 netstrings规范,则 633 应该是第一个:和最后一个之间的字符长度,

任何 8 位字节的字符串都可以编码为 [len]":"[string]","。这里 [string] 是字符串, [len] 是 ASCII 数字的非空序列,以十进制表示 [string] 的长度。ASCII 数字是 <30> 表示 0,<31> 表示 1,以此类推直到 <39> 表示 9。禁止 [len] 前面的额外零:[len] 以 <30> 开头,正好在 [ string] 为空。

例如,字符串hello world!被编码为31 32 3a 68 65 6c 6c 6f 20 77 6f 72 6c 64 21 2c,即12:hello world!,

所以,我弄错了长度。这怎么解释?

4

2 回答 2

1

据我所知,您的示例响应长度正确。

根据此处的示例: http ://en.wikipedia.org/wiki/Simple_Common_Gateway_Interface

字段值之前和之后是 <00> 符号(带有十六进制代码 00 的 ASCII 符号),例如:

REQUEST_METHOD <00>GET<00>

一旦我在您的响应片段中添加了缺失的空格——它很快就恢复到了 633 字节,正如所宣传的那样。

我想在将响应传递给我们的过程中的某个地方,一些软件剥离了 <00>,这是完全正常的行为吗?

无论如何,答案似乎是——您的 nginx 要么返回正确的长度,要么您的响应在某处剥离 <00>。

于 2015-03-18T00:58:36.820 回答
-1

好,

中的十六进制<31 32 3a 68 65 6c 6c 6f 20 77 6f 72 6c 64 21> 是(无引号),长度是 12(你好世界!)ASCII"12:hello world!"

<31 32 3a 68 65 6c 6c 6f 20 77 6f 72 6c 64 21 2c>示例中的这个是错误的(至少它不符合 nginx 规范。)(因为内部长度是 13,而十六进制中指定的长度是 12):

ASCII"12:hello world!,"应该是"13:hello world!,"和十六进制<31 33 3a 68 65 6c 6c 6f 20 77 6f 72 6c 64 21 2c>

这条线是一团糟:

例如,字符串“hello world!” 被编码为<31 32 3a 68 65 6c 6c 6f 20 77 6f 72 6c 64 21 2c>,即“12:hello world!”。

OK) 12:hello world!  ---> <31 *32* 3a 68 65 6c 6c 6f 20 77 6f 72 6c 64 21>

KO) 12:hello world!, ---> <31 *32* 3a 68 65 6c 6c 6f 20 77 6f 72 6c 64 21 2c>

OK) 13:hello world!, ---> <31 *33* 3a 68 65 6c 6c 6f 20 77 6f 72 6c 64 21 2c>

** 内的十六进制是长度的第二个数字。

然后你对这个的概念好吧,这个例子很糟糕。

于 2015-03-11T16:48:28.593 回答