ゴマちゃんフロンティア

アザラシが大好きなエンジニアの開発日記です

【PHP】外部からアクセスした際にIIS側のエラー画面が表示される件について

time 2017/12/08

というわけで、今回はPHPとIISに関するちょっとしたお話です。
ちょっと前に「IIS上でPHPを動かしてハマったこと」なんて記事を書きましたが、最近またハマってしまったので、その点について備忘録として書いておきます。

ハマった内容ですが、「外部のサーバやPCからアクセスした場合に、IISの401404のエラー画面が表示されてしまう」というものです。
(ローカルからアクセスした場合は問題ありません)
生のPHPならまだしも、MVCなフレームワークを使っていると邪魔でしかありません。特に困るのがステータスコード401を返した場合で、本来なら401を返しつつログイン画面に飛ばされるのを期待しますが、IISの場合は「権限がありません」というページ一点張りです。
IISなエラー画面故に「権限ってフォルダの権限か?」と疑ってしまうのもハマる原因です。

結論ですが、IIS設定ファイル内のhttpErrorsの属性の1つerrorModeのデフォルトがDetailedLocalOnlyとなっているためのようです。マイクロソフトのドキュメントには「ローカルからは詳細なエラー、外部からはカスタムエラーページを返す」旨の説明があります。
https://docs.microsoft.com/en-us/iis/configuration/system.webServer/httpErrors/

ここでいうカスタムエラーページはIIS側のエラー画面に相応するので、外部からアクセスした場合のみ表示が変わります。構文エラー等で真っ白になることはなくなりますが、逆をいえばPHPのフレームワーク側でエラー画面のレンダリングしたとしても、それをスルーしてIIS側のエラー画面が表示されてしまうわけです。

ということで、web.config<system .webServer>内に以下を追加してみました。

<httpErrors errorMode="Detailed" defaultResponseMode="File">
    <clear />
</httpErrors>

Detailedを指定すれば中のclearは要らなそうですが、一応ということで。上手く指定されていれば、IISマネージャの「エラーページ」の一覧が空になっているはずです。

IISも慣れればなんてことはないのかもしれませんが、不慣れな人にとっては「GUIで設定できる」ということも相まって逆に混乱してしまいます。
自分が正にそれだったので、こういった予備知識は経験したらメモしておきます。

down

コメントする