.htaccessによるディレクトリごとの設定

.htaccessを使用するには、メインの設定ファイル (httpd.conf) でその使用が許可されている必要があります。

Redirect (URL転送)

クライアントが新しいURLを取得するように、リダイレクトを送ります。

Redirect [status] URL-path URL
status引数
キーワードHTTPステータス説明
permanent301永久に移動した
temp302一時的に移動した (既定値)
seeother303他のもので置き換えた
gone410永久に削除した

URL-pathはリダイレクト元のURLで、スラッシュ ( / ) から始まる絶対パスで記述します。

URLはリダイレクト先のURLで、スキーム名 (httpなど) から始まる絶対URLで記述します。URL-pathと同様にスラッシュから始まるパスで記述した場合には、現在のスキーム名とホスト名を指定したものとみなされます。ただしサーバの設定によっては正常に処理されないことがあるので、絶対URLで記述すべきです。

サンプル

Redirect permanent /xxx/yyy http://www.example.com/zzz

これは、例えば次のようにリダイレクトされます。

http://www.example.com/xxx/yyy/index.html
 ↓
http://www.example.com/zzz/index.html

Rewrite (URL書き換え)

書き換えを使用するには、あらかじめ設定ファイル (httpd.conf) でmod_rewriteモジュールが読み込まれている必要があります。

また書き換えを有効にするには、最初にRewriteEngineディレクティブの設定で[on]を指定する必要があります。

RewriteEngine on|off

書き換えパターン

RewriteRule Pattern Substitution [flags]

Pattern引数

Patternは.htaccessファイルが置かれたディレクトリの、後のスラッシュ ( / ) を除いたパスが対象となります。つまり、

RewriteRule ^(.*)$ xyz/$1

というパターンで.htaccessがhttp://www.example.com/にあるならば、

http://www.example.com/index.html
 ↓
http://www.example.com/xyz/index.html

のように書き換えられます。

ただしPatternがマッチする対象は、RewriteBaseディレクティブを設定することにより変化します。

Substitution引数

SubstitutionでURLパスを指定する場合は、ドキュメントルートからの相対パスとなります。

flags引数

キーワード説明
NC (nocase)大文字と小文字を区別しない
NE (noescape)URLエスケープを行わない
L (last)書き換えを終了し、これ以上書き換えルールが適用されないようにする
R (redirect)リダイレクトを強制する

書き換えを実行する条件の指定

RewriteCond TestString CondPattern [flags]

TestStringCondPatternの条件に一致する場合のみ、書き換えが実行されます。

flags引数
キーワード説明
NC (nocase)大文字と小文字を区別しない
OR (ornext)次の条件も考慮する
NV (novary) 
※ キーワードは、かっこ内のものでも可

サンプル

RewriteEngine on
RewriteCond %{HTTP_HOST} ^(example\.com)(:80)? [NC,OR]
RewriteCond %{HTTP_HOST} ^(www2\.example\.com)(:80)? [NC]
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L]

参照

  • useful examples - Apache HTTP Server
  • more useful examples - Apache HTTP Server

静的URL

URLのクエリストリングを、パス名の一部であるかのように偽装します。このようにして作成されたURLを、静的URLと呼称します。

この方法を用いると、例えば

http://example.com/?a=1&b=2

のようなクエリを含むURLを

http://example.com/a=1/b=2/

のように表せます。

これを実現するにはアクセスされた際に本来のURLに書き換えるように、RewriteRuleで次のように指定します。これ例ではクエリの数が変化することも考慮して、2パターンの書き換え規則を定義しています。

RewriteRule ^([^/]+)/ ?$1 [L]
RewriteRule ^([^/]+)/([^/]+)/ ?$1&$2 [L]

なおこのようにしてURLを書き換えた場合、静的URLが相対パスの基準となります。そのため画像や他ページへのリンクが相対パスで記述されている場合には、パスがずれてしまい問題が生じます。

特殊文字のエンコード

RewriteRuleは書き換え時にURLエンコードを行います。そのためクエリ文字列に特殊文字を含むとき、URLが書き換えられた場合とそうでない場合でクエリが異なってしまいます。

http://www.example.com/index.html?q=%E6%96%87%E5%AD%97
 ↓
http://www.example.com/index.html?q=%25E6%2596%2587%25E5%25AD%2597

この問題はRewriteRuleにNE (noescape) フラグを指定して、エスケープを抑制することで解決できます。Pukiwiki移転の際に便利なmod_rewriteの設定メモ

RewriteRule ^(.*)$ http://www.example.com/$1 [NE]

エラーページのカスタマイズ

ErrorDocument error-code document

サンプル

ErrorDocument 401 /error/401.html
ErrorDocument 403 /error/403.html
ErrorDocument 404 /error/404.html
ErrorDocument 500 /error/500.html

404ページ

リンク切れなどによって無効なページが表示された場合に備えてカスタマイズした404ページを用意しておくことで、問に有効なリンク先を提示することができます。
404 ページのカスタマズ - ウェブマスター/サイト所有者 ヘルプ

HTTPエラーメッセージの簡易表示

確実にエラーページを表示させるには、エラーページのサイズを512バイト以上にする必要があります。これはInternet Explorerの「HTTPエメッセージの簡易表示」機能を回避するためです。Internet Explorerの "HTTP エラー メッセージの簡易表示" 機能をサーバー側で無効にする方法

アクセス制御

Order ordering
ordering引数
キーワード説明
Deny,AllowDenyをAllowより先に評価る。既定ではアクセスを許可
Allow,DenyAllowをDenyより先に評価する。既定ではアクセスを拒否
Mutual-failureAllow,Denyと同義。(このキーワードは非推奨)
※ キーワードは上記の通りに記述する。コンマの前後に空白があってはならない。
Allow from all | host
Deny from all | host
Deny ディレクティブ - Apache HTTP サーバ

特定のファイルへのアクセスを制限する

<FilesMatch regex> ... </FilesMatch>
<FilesMatch> ディレクティブ - Apache HTTP サーバ

サンプル

<FilesMatch "\.(gif|jpe?g|png)$">
  Order Allow,Deny
  Deny from all
</FilesMatch>

HTTP基本認証 (BASIC認証)

AuthType Basic
AuthName [記憶領域の名前]
AuthUserFile [ユーザー名とパスワードの一覧を格納したファイルのパス]
Require valid-user

AuthNameは記憶領域の名前を表し、クライアントに対して使用するユーザー名とパスワードを通知するために用いられます。この名前にスペースが含まれる場合には、引用符 ( " ) で囲まなければなりません。

AuthUserFileで参照するファイルは、以下のようにユーザー名と暗号化したパスワードをコロン ( : ) で区切り、行ごとに列挙したものになります。

[ユーザー名1:暗号化したパスワード]
[ユーザー名2:暗号化したパスワード]
 .
 .