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] #ファイルが存在するならそれが返される
というふうなことができます。