NaoyaFukuma / webserv

This is when you finally understand why a URL starts with HTTP
3 stars 0 forks source link

<conf> is_cgi, cgi_path の使用をあらため、configの生成規則、仕様書を変更 #38

Closed NaoyaFukuma closed 1 year ago

NaoyaFukuma commented 1 year ago

リクエストラインのURIから、CGIスクリプトを特定することを検討した際に、 現状のconfigの仕様を変更することとした。

<結論> is_cgiを廃止し、cgi_pathcgi_extensionと変更する。

<現状> junさんの実装を参考にしており、そこから現状のconfigの仕様を作成した。 しかし、そもそもCGIについての理解が及んでおらずis_cgiディレクティブやcgi_pathディレクティブをどのように使うのかを想定できていなかった。

<問題点> (junさんの実装では)cgi_pathディレクティブの利用方法が、Python3のような値を設定し、ececve()の第一引数として使用するものだった。しかし、これでは、Pythonしか実行できないといった不都合が生じる。 また、リクエストラインのURIから、CGIスクリプトを特定し、それ以後をPATH_INFOとして扱う。 といった機能を実装するにあたって、CGIスクリプトを特定する作業が煩雑になるものであった。

<解決策> そこで、ApacheにおけるCGIの設定を参考にした。 (NginxはCGIをサポートしていないためか、複雑な設定を要するため) 例)

<Directory "/usr/lib/cgi-bin">
    Options +ExecCGI
    AddHandler cgi-script .cgi .pl
</Directory>

この設定の読み方は、/usr/lib/cgi-binディレクトリのサブディレクトリも含む配下に、 拡張子が.cgi | .pl であれば、CGIスクリプトと判定する。 なお、当該ディレクトリ配下で他の拡張子であれば静的リソースとしてCGIを挟まずリクエストが処理される。 というもの。 この設計思想を取り入れ、

location /usr/lib/cgi-bin {
  is_cgi on; // これは不要。cgi_extension に包含される。
  cgi_extension .cgi .pl;
  root /root/server1/
}

このように、is_cgiを廃止し、cgi_pathcgi_extensionと変更する。