88297


webサーバーの実装を勉強中です。forkしてexecveでCGIプログラムを実行しようと思っています。  
そのCGIプログラムへの引数は環境変数QUERY_STRINGに設定し、getenvで受け取るという認識です。

execveの第二引数ではなくQUERY_STRINGで渡すのは何故なのでしょうか？  
どういった経緯でこの様に規格が策定されたのでしょうか？


CC BY-SA 4.0
2022-04-11T15:54:39.907
88274
2022-04-12T12:39:23.503
2022-04-11T16:24:11.513
3060
44647
question
c cgi
CGIプログラムの引数を環境変数で渡すのはどうしてですか？


経緯までは知らんけど CGI の argc / argv はフツーに指定できるっス。

[CGI の仕様 - とほほ](https://www.tohoho-web.com/wwwcgi3.htm)

実際ウチの部内サーバーの test-cgi でちゃんと動いたっス。`http://10.10.10.10/cgi-bin/test-
cgi?ab%22b+c%23d` を開くと`argc is 2 argv is a\"b c#d` と表示されたっス。


CC BY-SA 4.0
2022-04-12T00:53:04.097
88282
2022-04-12T00:53:04.097
8589
88274
answer


世界で二番目に開発された[NCSA
httpd](https://ja.wikipedia.org/wiki/NCSA_HTTPd)でCGIが導入されました。今や当時のサイトは残っていませんが、INTERNET
ARCHIVEに保存されていました。[1997年12月10日のCGI Command line options
(http://hoohoo.ncsa.uiuc.edu/cgi/cl.html)](http://web.archive.org/web/19971210170913/http://hoohoo.ncsa.uiuc.edu/cgi/cl.html)には

> The command line is only used in the case of an ISINDEX query. It is not
> used in the case of an HTML form or any as yet undefined query type. The
> server should search the query information (the QUERY_STRING environment
> variable) for a non-encoded = character to determine if the command line is
> to be used, if it finds one, the command line is not to be used. This trusts
> the clients to encode the = sign in ISINDEX queries, a practice which was
> considered safe at the time of the design of this specification.

と書かれていて、 `=` を含む `QUERY_STRING`
の場合は環境変数を使用し、含まない場合はコマンドライン引数で渡すとされています。（あくまで当時の記述です）


CC BY-SA 4.0
2022-04-12T12:39:23.503
88297
2022-04-12T12:39:23.503
4236
88274
answer