プログラミング言語や環境設定を中心としたパソコン関連の技術メモです。
主にシステム開発中に調べたことをメモしています。TIPS的な位置付けで、気が向いたときにちまちま更新していきます。
cgi-bin/配下へディレクトリ指定でアクセスすると、403エラーになる(index.htmlが表示されない)のを対処する
結論から書くと、「RewriteRule」を記述した.htaccessを置いて、
ディレクトリが指定された場合はindex.htmlにリライトしてやればOKです。

例えばドキュメントルート直下に.htaccessを置く場合は

RewriteEngine on
RewriteCond %{THE_REQUEST} /cgi-bin/
RewriteRule ^(.*)\/$ /$1/index.html

のように記述します。

「cgi-bin/」配下に直接.htaccessを置く場合は、例えば

RewriteEngine on
RewriteRule ^(.*)\/$ /cgi-bin/$1/index.html
RewriteRule ^$ /cgi-bin/index.html

のように記述してください。

それでは詳細を書いていきます。

エラーメッセージ「attempt to invoke directory as script」とはなんぞや?』の記事で書いた通り
「ScriptAlias」を設定しているディレクトリ配下では、
URL指定でファイル名を省略した場合、自動では補完してくれないようでしてね。

例えば

http://example.com/cgi-bin/hoge/

と指定した場合、

http://example.com/cgi-bin/hoge/index.html

の内容が表示されるのを期待していたのですが、実際には403エラーになってしまいました。

これを何とかしたいなーと思ったのがきっかけです。

まず最初に「ScriptAlias」を無効にしてみっか!と思いましてね。
あれこれやってみました。

……が『Plesk環境でApacheの設定(httpd.confの内容を変更)する』で軽く触れた通り、
上手く行かなかったのです。

どうしましょうね(--ゞ

そんなこんなで途方に暮れかけたところ……閃きの神様が降りてきました。

駄目元でリライトしてみっか(-。-)ぼそっ

まさかね~。そんな簡単なことじゃないよね~。と半信半疑ながらも
「RewriteRule」を使って、URLの書き換えを行ってみることにしました。

というわけで、ドキュメントルート直下の.htaccessにこんな記述を追加φ(--)

RewriteEngine on
RewriteCond %{THE_REQUEST} /cgi-bin/
RewriteRule ^(.*)\/$ /$1/index.html

記述内容をざっくり説明すると「/cgi-bin/」を含むリクエストを対象に
「/」で終わるURLだったら、後ろに「index.html」を付けています。

RewriteCond %{THE_REQUEST} /cgi-bin/

の部分が「/cgi-bin/」を含むリクエストが対象だよ~な指定で

RewriteRule ^(.*)\/$ /$1/index.html

の部分が「うんちゃら/」を「うんちゃら/index.html」に書き換えるよ~な指定です。

結果……動いた\(≧▽≦)/

何だよ、これ!あっさり動くじゃん!
さっき試したときは駄目だった気がしたんだけどな~まぁ良いや(*´ェ`*)

ちなみにドキュメントルート直下ではなくcgi-bin/内に.htaccesを置きたい場合は、例えば

RewriteEngine on
RewriteRule ^(.*)\/$ /cgi-bin/$1/index.html
RewriteRule ^$ /cgi-bin/index.html

のように書いてあげます。

RewriteRule ^(.*)\/$ /cgi-bin/$1/index.html

の部分はリクエストが「/」で終わっていたら
「/cgi-bin/$1/index.html」を表示しますよ~な指定です。
「$1」にはリクエストの内容が相対パスで入ります。

例えば、入力されたURLが

http://example.com/cgi-bin/hoge/

だったら「$1」には「hoge」が入っていますよ。
「cgi-bin/」を基点とした相対パスですからね。

RewriteRule ^$ /cgi-bin/index.html

の部分は「http://example.com/cgi-bin/」のように「~/cgi-bin/」が指定されたとき用の指定です。
先程も書きましたがリクエストの内容は相対パスで渡ってきます。
「~/cgi-bin/」なリクエストが来た場合、cgi-bin/配下の.htaccessから見るとディレクトリ部分は空です。
指定はカレントディレクトリですからね。
つまり最後に「/」が付いていないのです。

そのため

^(.*)\/$

の条件にマッチしません。
よく分からなければ実際に消して

RewriteEngine on
RewriteRule ^(.*)\/$ /cgi-bin/$1/index.html

のみで試してみてください。

「http://~/cgi-bin/」のアクセスがリライトされないはずです。

そのため

RewriteRule ^$ /cgi-bin/index.html

を付けています。

書き方自体は他にもいろいろあると思いますけどね。
取りあえず「RewriteRule」を使えば「ScriptAlias」を設定しているディレクトリに対しても
ファイル名を省略した場合の自動補完ができるようです。
あとは好きな場所に好きな書き方で記述してください。

ってなところで、完了\(--)/
スポンサーリンク
 
このエントリーをはてなブックマークに追加 

category:● 環境設定関連 

  関連記事