locked
IIS7.5 + FastCGI + PHP5.2.11でサーバー変数REQUEST_URIが文字化けする

    質問

  • WebPlatform Installer 2.0を利用してインストールしています。
    具体的には、以下のようなスクリプトを用意し、

    <?php
    ini_set('mbstring.internal_encoding', 'UTF-8');
    ini_set('mbstring.http_input', 'UTF-8');
    ini_set('mbstring.http_output', 'UTF-8');
    phpinfo();

    以下のようなURLでアクセスすると、
    http://localhost/index.php/%e6%9c%aa%e5%88%86%e9%a1%9e
    $_SERVER['REQUEST_URI']や$_SERVER['PATH_INFO']の
    「%e6%9c%aa%e5%88%86%e9%a1%9e」の部分が文字化け状態で取得されます。
    (ブラウザでの文字エンコーディングはUTF-8)

    ただし、以下のようなURLでアクセスした場合、
    http://localhost/index.php/%e6%9c%aa%e5%88%86%e9%a1%9e/?code=%e6%9c%aa%e5%88%86%e9%a1%9e
    REQUEST_URIは文字化けしていますが、GET引数「code」の値は正常に取得できます。

    経緯としては、WebPIでWordpressをインストールした際、
    タグやカテゴリのスラッグがURLエンコードされているにも関わらず、
    アクセスしてもエントリーが検出できなかったため、この現象に気がつきました。

    PHP側のバグかとも思ったのですが、以下のようなFastCGIモジュールの修正プログラムがあったので、
    FastCGI側の処理なのかもと思いこちらで質問させていただきました。
    http://support.microsoft.com/default.aspx/kb/954946

    環境はWindows7(x64)および、WindowsServer2003(x86)で試しています。
    Server2003ではFastCGIのバージョン1.0と1.5の両方を試しましたが、同様の現象が発生します。
    念のため、Windows7環境でPHP5.2.6~5.3.1の各バージョンを試しましたが同様でした。

    問題の文字化け部分については、入出力および内部のエンコーディングがUTF-8なのにも関わらず、
    URLエンコードされた部分が『URLエンコード前の文字列をShift-JISに変換』したような感じで取得できてしまうため、
    ソースコード中でREQUEST_URIとPATH_INFOをSJIS->UTF-8変換することで、暫定的に対処しています。
    もっと簡単に、設定などで現象を回避できると良いのですが、どなたかご存じないでしょうか。

    2009年11月6日 4:02

回答

  • こんにちは。

    Windows 7 上の IIS で本件の動作確認してみました。php-cgi.exe のバージョンは 5.2.12 であることを確認しました。

    結果、出力はシステムのコードページを Japanese に設定した場合は Shift_JIS での出力、英語の場合は完全に化けて ??? のようになりました。 UTF-8 とならずに、常に CP_ACP に依存しているようです。

    # regression bug と思われますが、いかがでしょうか...

    ご参考までに。

    小山
    http://keicode.com/
    2010年2月2日 22:55
  • これ IIS6 は完全に FastCGI が別に出荷されていることに対して IIS7 は今 OS に含まれていることが影響しているようですね。IIS6.0 用 FastCGI は 1.5 にアップしていますのでそういう動作をしていますが、IIS7 用はまだ このレベルになっていないのではないかと思います。

    http://blogs.iis.net/ruslany/archive/2010/01/18/fastcgi-extension-1-5-for-iis-5-1-and-iis-6-0-rtw.aspx
    1/18 に IIS5用、IIS6用のものが公開されたと Ruslan は書いていますが、IIS7 用のアップデートについて書いていません。
    また、learn.iis.net の当該記事もこのタイミングで更新されています。

    それが現在の状況だと思います。

    なので IIS5/6 の環境の方は最新の FastCGI をインストールし、このスレッドの方法でご対応ください。
    現時点では IIS7 のほうはまだ制限になってしまいます。


    マイクロソフト株式会社 IT Pro エバンジェリスト 奥主 洋
    • 回答としてマーク fukuramikake 2010年2月4日 2:54
    2010年2月3日 10:09

すべての返信

  • 誰からも返信がついてなくて申し訳ありません。
    本件については Web PI 関係者で認識しました。
    まず私のほうで技術的に見てみますの今しばらく時間をいただければと思います。

    PHP on IIS サイトの「お客様の声」としても Wordpress に関係して類似書き込みをいただいています。

    奥主
    マイクロソフト株式会社 IT Pro エバンジェリスト 奥主 洋
    2010年1月26日 5:56
  • 返信ありがとうございます。本件なのですが、つい先ほど解決しました。
    IIS.NETのFastCGI関連の情報を探していたら、以下のページにそれっぽい情報がありました。
    http://learn.iis.net/page.aspx/248/configure-the-fastcgi-extension-for-iis-60/

    ページ真ん中あたりの
    Using UTF-8 encoding for server variables
    というセクションで、サーバー変数をUTF-8でやりとりするためのレジストリの登録コマンドが載っているので、
    それを試したところ、IIS6+FastCGI1.5の環境にて、REQUEST_URIが正常にUTF-8で受け取れるようになりました。
    for IIS6な情報なので、Windows7での検証環境では試してないのですが…

    最近のブラウザはアドレスバーの中の和名も元に戻して表示してくれたりするため、こういう使い方をするケースが多そうなので、
    この設定はデフォルトで有効になっていてくれても良い気がします。

    2010年1月31日 5:59
  • こんにちは。

    Windows 7 上の IIS で本件の動作確認してみました。php-cgi.exe のバージョンは 5.2.12 であることを確認しました。

    結果、出力はシステムのコードページを Japanese に設定した場合は Shift_JIS での出力、英語の場合は完全に化けて ??? のようになりました。 UTF-8 とならずに、常に CP_ACP に依存しているようです。

    # regression bug と思われますが、いかがでしょうか...

    ご参考までに。

    小山
    http://keicode.com/
    2010年2月2日 22:55
  • これ IIS6 は完全に FastCGI が別に出荷されていることに対して IIS7 は今 OS に含まれていることが影響しているようですね。IIS6.0 用 FastCGI は 1.5 にアップしていますのでそういう動作をしていますが、IIS7 用はまだ このレベルになっていないのではないかと思います。

    http://blogs.iis.net/ruslany/archive/2010/01/18/fastcgi-extension-1-5-for-iis-5-1-and-iis-6-0-rtw.aspx
    1/18 に IIS5用、IIS6用のものが公開されたと Ruslan は書いていますが、IIS7 用のアップデートについて書いていません。
    また、learn.iis.net の当該記事もこのタイミングで更新されています。

    それが現在の状況だと思います。

    なので IIS5/6 の環境の方は最新の FastCGI をインストールし、このスレッドの方法でご対応ください。
    現時点では IIS7 のほうはまだ制限になってしまいます。


    マイクロソフト株式会社 IT Pro エバンジェリスト 奥主 洋
    • 回答としてマーク fukuramikake 2010年2月4日 2:54
    2010年2月3日 10:09
  • IIS6については、1/18リリースの1.5 RTWに更新した上でレジストリ設定を行う。
    IIS7については、今のところFastCGIforIIS7の対応待ちといったところでしょうか。
    しかし1/18とは、割とタイムリーだったんですね。

    ひとまず、現状でのステータスは把握できましたので、回答済みマークをつけました。
    ありがとうございました。

    2010年2月4日 3:07
  • Ruslan がブログに追加情報を投稿してくれましたので URL 貼っておきます。
    http://blogs.iis.net/ruslany/archive/2010/02/05/fastcgi-module-differences-across-iis-versions.aspx

    マイクロソフト株式会社 IT Pro エバンジェリスト 奥主 洋
    2010年2月8日 5:56
  • IIS7.0向けFastCGIモジュール用のパッチが出たみたいですね。
    http://blogs.iis.net/ruslany/archive/2010/03/10/important-update-for-iis-7-0-fastcgi-module.aspx


    が、各OS毎の対応状況を見るとIIS7.5は…
    http://ruslany.net/2010/02/fastcgi-module-differences-across-iis-versions/

    「The remaining updates to the FastCGI Module for IIS 7.5 will be done in Windows Server 2008 R2 Service Pack.」
    だそうです…
    Windows7のIIS7.5用のFixもサービスパック待ちですかねぇ。

     

    2011/02/19 追記

    Windows7/Server2008R2のSP1が出たので、適用して試したところ、問題なくREQUEST_URIが取得できました。

    • 編集済み fukuramikake 2011年2月19日 4:26 SP1で直ったため
    2010年3月11日 3:19