WordPressの生成する.htaccessが既存のCGIに影響してしまった!

2010年11月26日

これまた自分用覚書。同様のケースが今後もありそうなので。

とある案件で、今までPCサイトとモバイルサイトを持っていたのだけど、
今回PCサイトのみをWordPressで作り変えました。

モバイルサイトの方は今回は何も手をつけていないのだけど、WordPressを設置してからモバイルサイトのメールフォームCGI(Perl)が使えなくなって焦りました。

問題のサイトの構成

ドキュメントルート
 |
+-- /wp-admin
+-- /wp-content
+-- /wp-include
 | -wp-config.php
 (略:その他、wp-***.phpファイルいろいろ)
 |-.htaccess(※1..WordPressにより生成)
 |
+-- /mobile(モバイルサイトディレクトリ)
   |+--/send
   |   |-.htaccess(※2..CGIをこのディレクトリで許可するために設置)
   |   |-mailform.cgi ※これが使えなくなった
   |   |-(略:メールフォームCGIのモジュールいろいろ)

   |-index.html
   |-form.html
   |-(略:その他静的なファイルいろいろ)

こんなかんじ。

/mobile/send/mailform.cgiを呼び出すと、

Access forbidden!
要求されたオブジェクトへのアクセス権がありません。 読み込みが許可されていないか、 サーバが読み込みに失敗したかでしょう。

あー、しまったー!って感じですね。
なんせ、このCGIはここのお客さんが以前に別の制作会社で作ってもらったものなので仕様はよくわからないのです。

でも、WordPressを入れる前は普通に動いてたので、何かしらWordPress関連のものが干渉してるのは容易に推測できました。

解決策

もともと、このサーバはcgi-bin以外でCGIを動かすためには.htaccessを置かなくてはいけないので(よくあるタイプ)、それで 上記※2 の.htaccessに以下のような記述がしてありました。

[default]
Options ExecCGI
AddType text/html cgi
AddHandler cgi-script cgi
[/default]

そこに、以下の記述を付け足して解決しました。

[default]
<IfModule mod_rewrite.c>
RewriteEngine Off
</IfModule>
[/default]

ハイ解決!!

まぁ単純な話なんですけど、ドキュメントルートにある、WordPressが自動生成した.htaccess(上記※1.)に以下のようなmod_rewriteの記述がしてあって、それが下層ディレクトリ全部に影響してたってことで。

[default]
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index.php$ – [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
[/default]

WPをルートにおいて、サブディレクトリに別のコンテンツを置くときは要注意。