勿論メモ書き(きっちり箇条書きとかで纏めてはいないので)
とりあえず、cgi-bin を閲覧 で403になる原因を調べてみた。
Apache 2.2 系と2.4系では、ネットで調べると、
Order ディレクティブ は、 Require ディレクティブ に変更になったので
Order とかAllow とか使わずに、Require を使う事は分かった。
だけどデフォルトで然程触ったつもりもないし、
htdocs のディレクトリの設置とも変わりがない権限な気がした。
なのでとりあえず、異常じゃないと思えたので、
error ログを見てみた。
error ログで
[Sat Nov 21 15:04:12.193888 2015] [authz_core:error] [pid 23584:tid 952] [client ::1:51703] AH01630: client denied by server configuration: C:/Apache/cgi-binperl_test.cgi
[Sat Nov 21 15:04:13.222947 2015] [authz_core:error] [pid 23584:tid 952] [client ::1:51703] AH01630: client denied by server configuration: C:/Apache/cgi-binperl_test.cgi
[Sat Nov 21 15:04:13.872984 2015] [authz_core:error] [pid 23584:tid 952] [client ::1:51703] AH01630: client denied by server configuration: C:/Apache/cgi-binperl_test.cgi
[Sat Nov 21 15:04:14.056995 2015] [authz_core:error] [pid 23584:tid 952] [client ::1:51703] AH01630: client denied by server configuration: C:/Apache/cgi-binperl_test.cgi
[Sat Nov 21 15:04:14.233005 2015] [authz_core:error] [pid 23584:tid 952] [client ::1:51703] AH01630: client denied by server configuration: C:/Apache/cgi-binperl_test.cgi
[Sat Nov 21 15:04:14.403015 2015] [authz_core:error] [pid 23584:tid 952] [client ::1:51703] AH01630: client denied by server configuration: C:/Apache/cgi-binperl_test.cgi
[Sat Nov 21 15:04:14.559024 2015] [authz_core:error] [pid 23584:tid 952] [client ::1:51703] AH01630: client denied by server configuration: C:/Apache/cgi-binperl_test.cgi
みたいなのが、起動しようと思うと必ず出てきたので、疑問に思いました。
初めはこれを見て、何処にもcgi-binperl_test なんていうのは設定していないのに・・・と
思ってよく見たら、何か繋がっていそうだったので気がついて、
これは・・・ディレクトリの指定まちがってる?!って思ったので、
ディレクトリを設定している場所(ScriptAlias もしくはAlias)を見たのでした。
とりあえず、私の場合のミスは、
cgi-binperl_test
は、
cgi-bin/perl_test.cgi
本当で
perl_test.cgi を閲覧しようとしているのにパスの指定が悪くて、
こうなんだろうと思えました。
そこで、cgi-bin のディレクトリを設定している部分を調べてみた。
私の場合は、なにやらいじっているので、367行前後にあるが
#ScriptAlias /cgi-bin/ "${SRVROOT}/cgi-bin/"
これを編集して
ScriptAlias /cgi-bin/ "${CGI-BINROOT}"
つまり強制的にhtdocs(私の環境の場合)に乗せてる感じにしてる記述している訳であるので、
別名のエイリアスなんだろうなって、そのままなんだけど、その理解であってると思う。
少し余談だが、
よく分からないので、まず自分のパスを眺めなおした。
私の場合は、
Apache / cgi-bin
/ htdocs
/ apache2.2.xx
/ apache2.4.xx-x86
/ apache2.4.xx-x64
といった並びになっている
Apache2.4.xx~~~ は、本来、サーバールートとして設定し、
つまりApache 本体になる。
これは設定したとしても、cgi-bin とhtdocs の場所は変えられるのだ。
Apache のバージョンとコンパイルが32bit か64bit かを色々変えられる様に設定しているので、
共通であるコンテンツとcgi-bin は、極力上部ディレクトリに退避したいのでこんな構成にしている。
では、余談気味でもあるが、一応説明を終えて、話を戻す。
細かな何度も使う固有の設定はDefine で指定している。
2.4.16の64bit の一例))
Define SRVROOT "C:\Apache\httpd-2.4.16-x64-vc11"
ServerRoot "${SRVROOT}"
Define CGI-BINROOT "C:\Apache\cgi-bin"
Define DOCUMENTROOT "C:\Apache\htdocs"
となっている。
上記な様に設定をしていたのだが、これを
前途のお手本となる
#ScriptAlias /cgi-bin/ "${SRVROOT}/cgi-bin/"
と比べた。
まず、
<Directory パス>のDrirecty ディレクティの場合
DocumentRoot "${DOCUMENTROOT}"
と書いた上で、
<Directory "${DOCUMENTROOT}">
と書いても
<Directory "${DOCUMENTROOT}/">
と書いても換わらない
(余談だけど、なぜかWindows で
<Directory "${DOCUMENTROOT}\">
つまり、ディレクトリのマークを\ だと動かない)
つまりディレクトリであると自動で判断してくれている
でも、ScriptAlias や、Alias は、違う!
完全にしっかり最後をディレクトリであると
/ か\ で閉じなければならない。
試してないが、多分ディレクトリだけでなく、
単体のファイル1つを別名として使えるのかもしれない。
なので、私の場合は
<Directory パス> で使う予定でdefine していたので
Define CGI-BINROOT "C:\Apache\cgi-bin"
となり、
これをそのままScriptAlias で
ScriptAlias /cgi-bin/ "${CGI-BINROOT}"
としていたので、最後を閉じていなかったのでこれが原因だった!!!!
つまり、正解は
ScriptAlias /cgi-bin/ "${CGI-BINROOT}"
ではなく、
ScriptAlias /cgi-bin/ "${CGI-BINROOT}/"
である。
また余談だが、<Directry パス>のディレクティブも
ScriptAlias も、ディレクトリの指定に \ が使えない\ が使える。
前途の通り、Directry ディレクティブは端折れるが、ScriptAlias やAliasは端折れない。
バグの元なので統一して欲しい、ややこしい・・・・・w
こんな単純なミスで必死に時間費やして、頭回して、変な疲労があるから、
案外モチベは下がるから、余計に時間はかかる。
Apache の小さな躓きは、毎回時間がかかって辛い^^;
Apache の設定って1度動けば、毎回触るところじゃないから、
まいったなー!と思いながら、それでもアレコレ触っちゃってたりするんです。
-------------------
余談ですが、
-------------------
ScriptAlias でなく、Alias を選ぶと、
スクリプトの設定以外を多少省けるが、
ScriptAlias の設定をすると、スクリプト以外のファイルを閲覧するならば
スクリプト以外のファイルタイプをDirectry ディレクティブの中に
書かなければいけない。
例えば、html を閲覧したければ、
初めからAlias ディレクティブでcgi-bin を公開する方法もあるが、
ある意味丸見えなので、極力避けるべきなんだろうと思う。
むしろ極力避けたいので、ScriptAlias という、ほぼ目的としては
cgi 用のディレクティブがあるのだと思う。
例 ScriptAlias の場合)
Define CGI-BINROOT "C:\Apache\cgi-bin"
と
ScriptAlias /cgi-bin/ "${CGI-BINROOT}/"
と設定し、
http://localhost/cgi-bin/_index.html
を閲覧しようとすると
500 Internal Server Error
となる。
スクリプトだけ許可される設定なので、
html などは見られない、設定が成されていないので。
なので、
<Directory "${CGI-BINROOT}">
AddHandler text/html .html
~~略~~
とAddHandler をつけなければ表示されない
どっちが便利なのかとか分からないが
セキュリティーなどどがえしして、簡易設定か
もしくは、全部がっちり手動で設定をするならば
ScriptAlias /cgi-bin/ "${CGI-BINROOT}/"
でなく
Alias /cgi-bin/ "${CGI-BINROOT}/"
でもいいかもしれない。
デバッグのときだけ、Alias 、実際の運営はScriptAlias とか使い分けるのも
良いかもしれないが、そもそもcgi-bin にテストの目的以外で
html のファイルや、それらがリンクする画像や、ファイルを置く意味は薄いかもしれない。
やっぱ、基本、cgi-bin は、個人的にScriptArias にしておこうかなと思っているのでした。
最後に・・・・余談だらけじゃないか!www
そしてApache を毎回何かを直そうとするとこんな感じになる。
いったりきたり、えらーログとアクセスログを眺めたり@x@
実際のパスの構成とかまで考えて
しかもバージョンによって2.2から2.4とかは閲覧できる権限設定がちがったりするし、
ネットでも探したり。
人が作った環境であると、そもそもPerl がうまく動いていない場合もあるので、
本当にcgi-bin が見える以前の問題もある。
まぁ・・・・一応解決できたからよかったと、忘れない為にメモしました。
お粗末<_ _>