Namazu-win32-users-ja(旧)


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Netscape + Apache 日本語で検索できない?



竹迫です。

>  大体そうです。Apache にするだけでは Namazu の検索は問題
>  ありませんが、検索結果上からパスに日本語を含む名前のファイルを
>  表示できなくなりました。
>
>  そこで WebDAV の日本語ファイル名問題を解決するために使われていると
>  いう、mod_encoding.so というモジュールを導入することで、日本語URL
>  の件は落着しましたが、今度は Namazu で日本語検索が出来なくなりました。

これは、mod_encoding の副作用の問題ですね。

私も namazu.cgi ではありませんが、mod_perl + mod_dav + mod_encoding の
組み合わせで開発をしていたときに、似たような状況に遭遇しました。

mod_encoding の設定で、EncodingEngine on とすると、HTTPリクエストヘッダ中に
現れるすべての文字列をURIアンエスケープして、さらに文字コードをサーバ側の
エンコーディングに変換してしまうといった副作用があります。mod_encoding の
ソースコードを読む限り、これは仕様のようです。

このため、GETメソッドで送られてくる ? 以降の文字列も、文字コード変換の
対象となってしまい、今回のような現象になってしまいます。

CGI から環境変数 QUERY_STRING を表示してみるとわかると思います。

この現象を回避するには、現状の httpd.conf を

<IfModule mod_encoding.c>
    EncodingEngine On
    SetServerEncoding UTF-8
    AddClientEncoding "Mozilla/5" JA-AUTO-SJIS-MS
</IfModule>

  ↓ 以下のように書き換えて、

<IfModule mod_encoding.c>
  <Location /DAV>
    EncodingEngine On
    SetServerEncoding UTF-8
    AddClientEncoding "Mozilla/5" JA-AUTO-SJIS-MS
  </Location>
</IfModule>

EncodingEngine を On にするディレクトリに制限をかければ
(この例では /DAV 以下のみ) 大丈夫なはずです。

逆に、namazu の動いている /cgi-bin 以下で EncodingEngine が Off に
なっていれば良いので、、、

<IfModule mod_encoding.c>
    EncodingEngine On
    SetServerEncoding UTF-8
    AddClientEncoding "Mozilla/5" JA-AUTO-SJIS-MS
    <Location /cgi-bin>
      EncodingEngine Off
    </Location>
</IfModule>

という書き方も可能かと思います。(動作確認はしていませんが・・・)

>  IIS 使用時は特別なことを何もしなくても、どのブラウザでも問題なく
>  検索できていましたし、日本語名のファイルも問題なく表示できていました。

>> Apacheに入れ替えたら、何が問題となったのでしょうか。そして、それ
>> はIISの時にはどうだったのでしょうか。

IIS の場合は、URI パス中に含まれる UTF-8 の文字列をサーバ上の
ファイルシステム上のエンコーディングに自動マッピングして
ファイルの参照を行なう仕組みになっているので、このような
問題は発生しません。環境変数 QUERY_STRING は、文字コード
変換の対象外なので、そのままということです。

Apache の mod_encoding は、HTTPリクエストヘッダ全体を
文字コード変換する仕組みなので、問題が発生していたのです。
POSTメソッドで渡ってくる部分はHTTPリクエストヘッダ外なので、
文字コード変換の対象外となり、そのままの値で参照可能なのですが、
今のところ namazu.cgi は、GETメソッドでしか動作しません。

--
  株式会社ドリーム・アーツ 製品企画開発本部
    竹迫 良範  <takesako@xxxxxxxxxx>