[ .htaccess ] 設定・書き方のまとめ

サーバのソフトが Apache なら、.htaccess と言うファイルを設置する事で色々できるみたい。
実際に試していない物もありますが、いつか使う時のため ( 忘れないため? ) に書いときます。

エラーページ

エラーの時にどうするかの設定。 404 とか 403 と言う番号は、HTTP ステータス・コード と言います。 とりあえず、401, 403, 404, 500 ぐらい設定しておけば良いのかな?

ファイルが見つからない ( 404 File Not Found ) 時、www.example.com に飛ばす

ErrorDocument 404 http://www.example.com/

上の様に書くと、アドレスバーに表示している URL が変わる?

ErrorDocument 404 /404.html

上の様に書くと、アドレスバーに表示している URL が変わらない?

ファイルへのアクセス権限がない ( 403 Forbidden ) 時、www.example.com に飛ばす

ErrorDocument 403 http://www.example.com/

ちなみに、サーバー障害時のエラー画面は、503, 504 で作ることができます。

リダイレクトする

永久・恒久的に移動する場合 ( 301 Moved Permanently )

Redirect permanent /test/ http://www.example.net/test/

上記のようなファイルを http://www.example.com/ に設置した場合、http://www.example.com/test/test.html は http://www.example.net/test/test.html に飛ばされる。
ディレクトリ構造を保ったままリダイレクトするので、サイト引越しの時に便利。
この時、前半に出てくる URL はルートパス ( ドメイン直下からのパス ) で書かないと動かない。
私はこれでハマりましたw

この書き方の場合、今後は新しい URL をリクエストするよう検索エンジンに伝える事ができるらしいです。

RedirectPermanent /test/ http://www.example.net/test/

上のように書く事も出来るらしいです。

一時的に移動する場合 ( 302 Moved Temporarily )

下の例は、test1.html へのアクセスを一時的に http://www.example.com/test2.html へリダイレクトする書き方。

Redirect temp /test1.html http://www.example.com/test2.html

サイトトップページの index.html を index.php にする

前提として、次の様な条件の場合を想定しています。

  • http://example.com/index.html 既に存在していない
  • http://example.com/index.php は存在している
  • トップページの URL は、http://example.com/ にしたい

何も考えず、次のように設定してしまうと無限ループに入ってしまい問題があります。

RedirectPermanent /index.html http://example.com/

こんな時は、まず、スラッシュ止めの URL でアクセスされた場合に表示させるファイル名の優先順位を変更してから、http://example.com/index.html を http://example.com/ にリダイレクトします。

DirectoryIndex index.php index.html
RedirectPermanent /index.html http://example.com/

気になる事

  • ルートディレクトリ以下の全てのフォルダで .htaccess が動くので重くなるのかな?
  • 下層ページからトップページへのリンクを /index.php と書いてしまうと、トップページの URL が http://example.com/ と http://example.com/index.php のふたつ存在するのでおかしいかな?

特定のホスト名でアクセスがあった場合にリダイレクトする ( ドメイン移転など )

Apache で [ mod_rewrite ] モジュールが有効になっている場合、外部から要求されたリクエスト URL を書き換えてリダイレクトできるんだそう。

次の例では、example.com か www.example.com と言うホスト名でアクセスがあった場合、example.net へリダイレクトさせます。

Options +FollowSymLinks
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^example\.com [NC,OR]
RewriteCond %{HTTP_HOST} ^www\.example\.com [NC]
RewriteRule ^(.*)$ http://example.net/$1 [R=301,L]

[ www あり ] と [ www なし ] を統一する

[ www あり ] に統一する場合

Options +FollowSymLinks
RewriteEngine on
RewriteCond %{HTTP_HOST} ^example\.com
RewriteRule ^(.*) http://www.example.com/$1 [R=301,L]

[ www なし ] に統一する場合

Options +FollowSymLinks
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.example\.com
RewriteRule ^(.*) http://example.com/$1 [R=301,L]

フィーチャーホンで /mobile 以外のアクセスを /mobile にリダイレクトする

RewriteCond %{REQUEST_URI} !^/mobile
RewriteCond %{HTTP_USER_AGENT} DoCoMo [NC,OR]
RewriteCond %{HTTP_USER_AGENT} UP\.Browser [NC,OR]
RewriteCond %{HTTP_USER_AGENT} SoftBank [NC,OR]
RewriteCond %{HTTP_USER_AGENT} Vodafone [NC,OR]
RewriteCond %{HTTP_USER_AGENT} J-PHONE [NC]
RewriteRule ^(.*)$ /mobile/ [R,L]

正規表現にマッチする時、リダイレクトさせる

次の例では、.htaccess を設置した階層以下の HTML ファイルを http://www.example.com/ にリダイレクトしている。

RedirectMatch permanent (.*)\.html http://www.example.com/

次の例では、.htaccess を設置した階層以下全てのファイルを http://example.com/index.html という単一ページにリダイレクトしている。

RedirectMatch 301 .* http://example.com/index.html

http → https へリダイレクトする(サイト全体)

普通の書き方だと、次のような感じ。

<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteCond %{HTTPS} off
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
</IfModule>

CPI ACE01 ( ACE01_2011 ) の場合は、次のように書き方が変わってるっぽい。
詳しくはコチラ → .htaccess の設定方法

Options +SymLinksIfOwnerMatch
RewriteEngine on
RewriteCond %{SERVER_PORT} !^443$
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

特定種類のファイルを文字コード指定で開く

サーバにアップしてあるテキストファイル ( *.txt ) をブラウザで開く時、強制的に Shift-JIS で開く設定です。

AddType "text/plain; charset=Shift_JIS" .txt

ファイルの一覧が表示されないようにする

URL の末尾がスラッシュ ( 例えば http://www.example.com/ ) でアクセスされた時、[ index.html ] が無いと、ディレクトリ内のファイル一覧が表示されてしまいます。

これを防止するには、.htaccess に次の一行を追加しておきます。

Options -Indexes

逆に、ディレクトリ内のファイル一覧を表示したい場合は、次のように書きます。

Options Indexes

この場合でも、index.html が存在している場合は、ディレクトリ内のファイル一覧は表示されません。

ベーシック認証

ベーシック認証をかけるには「.htaccess」と「.htpasswd」いうファイルを設置します。

各ファイルの設置場所

  • 「.htaccess」は認証をかけたいディレクトリに設置。設置したディレクトリ以下全てに制限がかかります。
  • 「.htpasswd」はドキュメントルートより上に設置するのが望ましい。

.htaccess の記述例

AuthUserFile /home/hoge/.htpasswd
AuthGroupFile /dev/null
AuthName "Please enter your ID and password"
AuthType Basic
require valid-user
<Files ~ "^.(htpasswd|htaccess)$">
  deny from all
</Files>

各記述の説明

AuthUserFile
パスワードファイルの場所をルートからのフルパスで記述する。
require valid-user
上の例は、ユーザーが誰であれ入力した ID・パスワードが合っていればアクセスできるという意味。
反対に特定ユーザーだけアクセス許可する場合は「require user xxx」と書く。
Files
「.htaccess」と「.htpasswd」を隠すための物。

.htpasswd の記述例

hoge:zjEYls2yaFjMU

「アカウント名:パスワード」と記述する。複数のアカウントを設定するときは改行して書く。パスワードは暗号化する事。

アクセス制限

特定の IP アドレスからのみアクセスを許可する

Deny from All
Allow from 192.0.2.0

[ Deny from All ] で全てのアクセスを一旦拒否して、[ Allow from 192.0.2.0 ] で 192.0.2.0 だけアクセスを許可している。

IP アドレス制限とユーザー認証の組み合わせてアクセス制限をかける

次のように設定すると、192.0.2.0 からのアクセスは通し、それ以外のアクセスには Basic 認証を要求します。

AuthUserFile /usr/home/hoge/.htpasswd
AuthGroupFile /dev/null
AuthName "Protected Area"
AuthType Basic
<Limit GET POST>
require valid-user
</Limit>

# IP アドレス制限以外は、BASIC 認証
Satisfy Any

# IP アドレス制限
order deny,allow
deny from all
allow from 192.0.2.0

拡張子 .html のまま PHP を実行する

AddHandler x-httpd-php536 .php .html

その他、.htaccess ファイルを書く時の約束事など

  • 最後の行にも改行を入れておく事。
  • ファイル内にコメントを書く時は、「#comment」のように頭にシャープを付けて書きます。
  • 文字コードが UTF-8 だと動かない。 とりあえず、文字コードは Shift_JIS で、改行コードは LF でやってます。 サーバに合わせるのかな?
  • .htaccess ファイルを設置したディレクトリ以下に適用されます。

.htaccess を作成する便利なウェブサービス

この記事のほとんどが、上のページで簡単にできそうな予感…。せっかく書いたのに…。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です