# .htaccess 設定できることいろいろ

.htaccess (ドット エイチティー アクセス)とは?

アパッチ(Apache)サーバーにおいて、ディレクトリ毎に設定を変更することが可能な設定ファイルです。

注意

  • 利用前提:httpd.conf ファイルの AllowOverride 許可設定が必要
  • 適応範囲:設置されたディレクトリとサブディレクトリすべて
  • 構文:httpd.conf などの主設定ファイルと同じ
  • .htaccess ファイルの使用は極力避けてください
  • ユーザ認証ベーシック認証でも .htaccess ファイルでやらない方がいい(主設定ファイルで設定)

参考:Apache チュートリアル (opens new window)

# .htaccess ファイルの極力使用しない方がいい理由

.htaccess ファイルの極力使用しない方がいい理由は複数あります

# サーバの性能が低下

.htaccess 許可するだけで、Apache は各ディレクトリに.htaccess あるかどうか必ずチェックします。特にディレクトリ階層が深い場合、全ディレクトリに.htaccess チェックします。これだけでも、サーバーの性能に影響しますが、設定がリクエストされる度に中身を読み込んで処理することも生じます。主設定ファイルなら Apache が起動時に 1 回だけの読み込みで完了します。

# セキュリティ問題 root 権限なしで、サーバーの設定変更できる

ユーザにどの程度の権限を与えるかは要検討で、AllowOverride 設定 (opens new window)をしっかり管理しなければ、深刻なセキュリティ問題になり得る。

# .htaccess 使うシーン

  • サーバの主設定ファイルにアクセスできない場合
  • サーバ管理者が頻繁に個々のユーザのために設定変更を行ないたくない場合

レンタルサーバーではよく見る.htaccess 設定って、原因はこれですね。

使うには AllowOverride 設定 (opens new window) で許可が必要

# .htaccess 適用の優先順位

優先順位

  • .htaccess 設定のディレクティブ階層上から順番に適用

主設定ファイルとのマージ

  • AllowOverride 許可している全体ですが、.htaccess と主設定ファイルに同じ設定があれば、.htaccess が勝ちます

# .htaccess の書き方

<IfModule mod_rewrite.c>
    RewriteEngine on
    :
    処理を記述
</IfModule>
  • <IfModule mod_rewrite.c>の役割は rewirte モデルがオンしているいるかの if 分判断(省略可能)
  • </IfModule>は endif みたいの感じ
  • 正規表現リダイレクト系は RewriteEngine on 必須
  • ルールは正規表現で書く

# ベーシック認証

一般公開したくないけど、ユーザー認証サーバー建てるのは面倒な時に便利なベーシック認証は、.htaccess で簡単設定できます。

AuthType Basic
Require Group admins
AuthName "パスワード必要"
AuthUserFile /www/passwords/password.file
AuthGroupFile /www/passwords/group.file

password.file id:password 形式で格納
パスワードは暗号化する必須 暗号化ツール (opens new window)

userId:pasuwa-do

# 301 リダイレクト

サイト引っ越しなどでよく使われる 301 永久リダイレクト

RewriteEngine On
RewriteCond %{http_host} ^www.old-domain.com
RewriteRule ^(.*) https://www.new-domain.com/$1 [R=301,L]

# 302 一時的なリダイレクト

RewriteRule    ^page.htm$    new_page.htm    [R,NC,L]

# SSL リダイレクト

RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

# URL 正規化 www のありなし

www から www なしにリダイレクト

# www から www なしにリダイレクト
RewriteCond %{HTTP_HOST} ^www\.domain\.com
RewriteRule (.*) http://domain.com/$1 [R=301,L]

www なしから www にリダイレクト

# www なしから www にリダイレクト
RewriteCond %{HTTP_HOST} ^domain\.com
RewriteRule (.\*) http://www.domain.com/$1 [R=301,L]

# ファイル一覧出力拒否

Options -Indexes

# 指定 IP 指定ドメインをブロック

order allow,deny
allow from all
deny from example.com
deny from 192.168.1.1

# デフォルト index ページ

DirectoryIndex index.php index.html main.html

# エラーページの指定

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

# データ圧縮

<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE text/x-component
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/x-javascript
</IfModule>

# 最後

資料をまとめながら非常に勉強になります。.htaccess の基本構造、使うシーン使わない理由なども理解しました。
リダイレクトのやり方や IP 制限など、次ぐに使えそうな設定がいっぱいあるから Apache の人気の理由もよくわかります。
404 ページなどエラーページの指定や、データ圧縮は使ったことありませんが、このくらいあれば、もう.htaccess の設定で困ることないでしょう

2020-02-17
  • apache