Date: Mon, 31 Mar 2008 06:02:48 +0900 Comment: linux/tips/apacheにmod_mimeおよびmod_rewriteのTipsを追記 ================================================================== === linux/tips/apache/index.wiki.txt ================================================================== --- linux/tips/apache/index.wiki.txt +++ linux/tips/apache/index.wiki.txt @@ -1,7 +1,57 @@ -${smdncms:tags,Apache,mod_autoindex} +${smdncms:tags,Apache,mod_autoindex,mod_mime,mod_rewrite} *Apache -**mod_autoindexのカスタマイズ +**mod_mime +***Content-Typeで返すcharsetを変える +デフォルトのcharsetを変える場合はAddDefaultCharsetで指定する。 AddDefaultCharsetはtext/plainあるいはtext/htmlに適用される。 拡張子別に指定する場合は、AddCharsetを用いる。 + AddDefaultCharset utf-8 + AddCharset utf-8 .xhtml + AddCharset utf-8 .xml + AddCharset utf-8 .rdf +このように設定するとMIME Typeがtext/plain, text/htmlのファイルおよび.xhtml, .xml, .rdfの拡張子を持つファイルの場合はcharsetにutf-8が設定される。 AddDefaultCharset Offにすると設定を無効にできる。 + +***gzip圧縮されたファイルを展開した状態で表示させる +AddEncodingを設定することでレスポンスの内容エンコーディング(Content-Encoding)を指定できる。 例えば.diff.gzの拡張子を持つファイルについて、AddEncodingで内容エンコーディングにgzipやcompressを指定して返せば、UA側では解凍した状態で表示するようになる。 + + AddEncoding x-gzip .gz + ForceType "text/plain" + +設定の各行の詳細な意味は次のとおり。 +:|拡張子に.diff.gzを持つファイルについて以下の設定を適用する +:AddEncoding x-gzip .gz|拡張子に.gzを持つファイルは内容エンコーディングにx-gzipを指定して返す(x-gzipはgzipと等価、またx-compress(=compress)も指定できる) +:ForceType|MIME Typeをtext/plainに上書きする(これを設定しない場合、Content-Typeには.gzに割り当てられているデフォルトのMIME Type(application/x-gzip等)を載せてしまう) +このようにすると、UA側では受け取ったレスポンスをgzipで解凍し、text/plainとして表示する。 ただし、Firefox 2.0ではプレインテキストとして表示するが、IE 7.0ではファイルのダウンロードの動作となってしまう(Content-Typeではなく拡張子の.diff.gzを見て表示出来ない形式として判断しているため?)。 + +**mod_rewrite +***application/xhtml+xmlに対応していないUAに対してはtext/htmlで返す +XHTMLなどをapplication/xhtml+xmlとして配信する場合に、Microsoft Internet Explorer(6.0, 7.0)などのapplication/xhtml+xmlに対応していない(または望ましくない挙動をする)UAからのリクエストに対しては、Content-Typeをtext/htmlにする方法。 + AddType "application/xhtml+xml" .xhtml + RewriteEngine on + RewriteCond %{LA-F:REQUEST_FILENAME} \.xhtml$ + RewriteCond %{HTTP_ACCEPT} !application/xhtml\+xml [OR] + RewriteCond %{HTTP_USER_AGENT} MSIE.6\.0 + RewriteRule .* - "[T=text/html; charset=utf-8]" +設定の各行の詳細な意味は次のとおり。 +:AddType "application/xhtml+xml" .xhtml|拡張子.xhtmlを持つファイルにapplication/xhtml+xmlのMIME Typeを持たせる +:RewriteEngine on|RewriteEngineをonにする +:RewriteCond %{LA-F:REQUEST_FILENAME} \.xhtml$|リクエストURIで返されるファイルの拡張子が.xhtmlで、かつ続く条件にマッチする場合にRewriteRuleを適用する +:RewriteCond %{HTTP_ACCEPT} !application/xhtml\+xml [OR]|Acceptヘッダにapplication/xhtml+xmlを含まない場合か、または続く条件にマッチする場合にRewriteRuleを適用する +:RewriteCond %{HTTP_USER_AGENT} MSIE.6\.0|User-AgentにMSIE 6.0を含む場合にRewriteRuleを適用する +:RewriteRule .* - "[T=text/html; charset=utf-8]"|Content-Typeヘッダを'text/html; charset=utf-8'に書き換えてレスポンスを返す +このように設定することで、Acceptヘッダにapplication/xhtml+xmlを含まないUAかIE 6.0が拡張子.xhtmlファイルをリクエストした場合にtext/htmlで返すようになる。 IE 6.0はAcceptヘッダにapplication/xhtml+xmlを載せたリクエストを送って来るが、application/xhtml+xmlで返しても正しく表示されないのでtext/htmlとして返すようにしている。 参考:[[XHTML1.1と application/xhtml+xml - Blog - Gertrud:http://gertrud.jp/blog/archives/000200.html]] + +***/?foo=barの形式でのリクエストを別のスクリプトにリダイレクトする +URLにCGI等のスクリプトファイル名を指定しないでクエリだけが指定されている場合に、そのリクエストを別のスクリプトにリダイレクトする例。 + RewriteCond %{QUERY_STRING} .+ + RewriteRule ^$ /moved.cgi [L,R=301,QSA] +設定の各行の詳細な意味は次のとおり。 +:RewriteCond %{QUERY_STRING} .+|クエリ文字列が1文字以上の場合にRewriteRuleを適用する +:RewriteRule ^$ /moved.cgi [L,R=301,QSA]|リクエストURIからクエリ文字列を除いた部分が空白(つまり/のみ)の場合、moved.cgiにリクエストをリダイレクトする。 また、これ以上の書き換えを行わない(L)、ステータスコードとして301 Moved Permanentlyを返す(R=301)、書き換えたURLに元のクエリ文字列を追加する(QSA) +このように設定すると、リクエストURI"/?foo=bar"は"/moved.cgi?foo=bar"にリダイレクトされる。 この例ではクエリ文字列に何も含まない場合はリダイレクトされない(リクエストURI"/"は"/moved.cgi"にリダイレクトされない)が、何も含まれていない場合でもリダイレクトしたい場合は、 + RewriteCond %{QUERY_STRING} .* +とする。 + +**mod_autoindex mod_autoindexのカスタマイズに関するメモ。 参考資料: [[mod_autoindex - Apache HTTP サーバ:http://httpd.apache.org/docs/2.0/ja/mod/mod_autoindex.html]] ***表示されるアイコンを変える