我在运行最新OSX的mac上通过macports安装了nginx(nginx version: nginx/1.7.9
)。
我配置了一个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;
}
当我在127.0.0.1/server
上发出GET请求时,我在SCGI服务器上看到以下内容:
633:CONTENT_LENGTH0REQUEST_METHODGETREQUEST_URI / serverQUERY_STRINGCONTENT_TYPEDOCUMENT_URI / serverDOCUMENT_ROOT /选择/本地/ htmlSCGI1SERVER_PROTOCOLHTTP / 1.1REMOTE_ADDR127.0.0.1REMOTE_PORT62088SERVER_PORT80SERVER_NAMElocalhostHTTP_HOST127.0.0.1HTTP_CONNECTIONkeep-aliveHTTP_CACHE_CONTROLmax年龄= 0HTTP_ACCEPTtext / HTML,应用/ XHTML + xml的,应用/ XML; Q = 0.9,图像/ WEBP, / 的; q = 0.8HTTP_USER_AGENTMozilla / 5.0 (Macintosh; Intel Mac OS X 10_10_2)AppleWebKit / 537.36(KHTML,如 Gecko)Chrome / 40.0.2214.115 Safari / 537.36HTTP_DNT1HTTP_ACCEPT_ENCODINGgzip,收缩, sdchHTTP_ACCEPT_LANGUAGEen-US,en; q = 0.8,文件结束
问题是netstring的长度633与解释不匹配。如果我正确理解了netstrings spec,则633应该是第一个:
和最后一个,
之间的字符长度:
任何8位字节的字符串都可以编码为[len]“:”[string]“,”。这里[string]是字符串,[len]是一个非空的ASCII数字序列,以十进制表示[string]的长度。 ASCII数字是< 30>对于0,< 31>对于1,依此类推至< 39>对于[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!,
。
所以,我的错误长度。怎么解释这个?
答案 0 :(得分:1)
据我所知,您的示例响应具有正确的长度。
根据这里的例子: http://en.wikipedia.org/wiki/Simple_Common_Gateway_Interface
字段值之前和之后是< 00>。符号(带十六进制代码00的ASCII符号),例如:
REQUEST_METHOD <00>GET<00>
一旦我在您的回复片段中添加了缺失的空格 - 它会很快恢复到633字节,正如所宣传的那样。
我想在某个地方正在将这个回复传递给我们,有些软件被剥夺了,这是完全正常的行为吗?
无论如何,答案似乎是 - 你的nginx要么返回一个正确的长度,要么你的回复正在剥离&lt; 00&gt;在某处。
答案 1 :(得分:-1)
好吧,
十六进制<31 32 3a 68 65 6c 6c 6f 20 77 6f 72 6c 64 21>
在ASCII
中是"12:hello world!"
(没有引号),长度是12(你好世界!)
示例中的这个<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!”编码为&lt; 31 32 3a 68 65 6c 6c 6f 20 77 6f 72 6c 64 21 2c&gt;,即“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>
**内的十六进制是长度的第二个数字。
然后你关于这个的概念好了,这个例子很糟糕。