mod_rewriteが扱うパスはデコードされている

    foo/あああ/

をuriencodeすると

    foo/%E3%81%82%E3%81%82%E3%81%82/

になります。
ブラウザは日本語のURLでも自動的にこんな風にエンコードしてリクエストするんですが、このパスをmod_rewriteで、

#    foo/文字列/    ->    文字列.html    に変換

RewriteRule    ^foo/([^/]+)/$    $1.html

のように書き換える場合、これは

    %E3%81%82%E3%81%82%E3%81%82.html

でなく

    あああ.html

になります。

#ファイルが存在して"いる"かどうかチェック

RewriteCond    %{DOCUMENT_ROOT}%{REQUEST_URI}   -s

すると、mod_rewriteのレベルで後者と認識されているとわかります。


勝手にデコードされる! とwebには多くの叫び声が漂ってますが、しかしこれはこれである意味正しく、実際に便利に使えます。
サーバの文字コードutf-8であれば、

path = u'あああ.html'       #unicode文字列
path = path.encode('utf-8') #サーバの環境に合わせ適切な文字コードにエンコード

f = file(path, 'wb')
f.write(content)
f.close()

として書き出しておくと、

#パスを書き換え
RewriteRule    ^foo/([^/]+)/$    $1.html

#ファイルが存在して"いない"なら    foo.pyにその名前をクエリで渡し
RewriteCond    %{DOCUMENT_ROOT}%{REQUEST_URI}    !-s
RewriteRule    ^([^/]+)\.html$    foo.py?word=$1    [L]

#ファイルが存在するならそれが返される

というふうなことができます。