0

nginx version: nginx/1.7.9最新の OSX を実行している Mac に macports 経由でnginx ( ) をインストールしました。

SCGI を使用するように URI を構成しました。

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 (Gecko のような KHTML) Chrome/40.0.2214.115 Safari/537.36HTTP_DNT1HTTP_ACCEPT_ENCODINGgzip, deflate, sdchHTTP_ACCEPT_LANGUAGEen-US,en;q=0.8,ファイルの

問題は、ネット文字列の長さ 633 が解釈と一致しないことです。netstrings の仕様:を正しく理解していれば、最初と最後の間の文字の長さは 633 になるはずです,

8 ビット バイトの任意の文字列は、[len]":"[string]"," としてエンコードできます。ここで、[string] は文字列で、[len] は [string] の長さを 10 進数で示す空でない ASCII 数字のシーケンスです。ASCII 数字は、0 の場合は <30>、1 の場合は <31>、9 の場合は <39> まで続きます。[len] の前にある余分なゼロは禁止されています。文字列] は空です。

たとえば、文字列はhello world!としてエンコードされます。31 32 3a 68 65 6c 6c 6f 20 77 6f 72 6c 64 21 2c12:hello world!,

だから、私は間違った長さを取得しています。これはどのように説明できますか?

4

2 に答える 2

1

私が知る限り、あなたの応答例の長さは正しいです。

ここの例によると: http://en.wikipedia.org/wiki/Simple_Common_Gateway_Interface

フィールド値の前後には <00> 記号 (16 進コード 00 の ASCII 記号) が続きます。例:

REQUEST_METHOD <00>GET<00>

不足しているスペースを応答スニペットに追加すると、宣伝どおりにすぐに 633 バイトに戻りました。

ここでその応答を私たちに渡すプロセスのどこかで、ソフトウェアの一部が <00> を削除したと思いますが、これはまったく正常な動作ですか?

とにかく、答えは次のようです – nginx が正しい長さを返しているか、応答が <00> のどこかを削除しています。

于 2015-03-18T00:58:36.820 に答える
-1

良い、

の 16 進数<31 32 3a 68 65 6c 6c 6f 20 77 6f 72 6c 64 21> は(引用符なし) で、長さASCII"12:hello world!"12 (Hello World!) です。

そして、この<31 32 3a 68 65 6c 6c 6f 20 77 6f 72 6c 64 21 2c>は間違っています(少なくとも、nginx の基準とは一致しませんでした) (内部の長さが 13 で、16 進数で指定された長さが 12 であるため):

ASCIIはおよび 16 進数で"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>

** 内の 16 進数は、長さの 2 番目の数値です。

次に、これに関するあなたのコンセプトはわかりました。例は悪いです。

于 2015-03-11T16:48:28.593 に答える