.htaccessの設定

目次

.htaccessとは

公式ページより引用です。
時間に余裕があれば公式ページを一読すると理解が深まります。

.htaccess ファイル (「分散設定ファイル」) は ディレクトリ毎に設定を変更する方法を提供します。ディレクティブの 書かれたファイルをディレクトリに置くことで、そのディレクトリとそのサブディレクトリすべてにディレクティブを適用させることができます。

.htaccessで出来ること

例えば以下のようなことができます。

1.BASIC認証
2.301リダイレクト
3.URLの正規化
4.ファイル一覧表示の中止
5.特定のIPアドレスやドメインからのアクセス制限

いつ.htaccessを使うか

基本的には使わないほうが良いです。
.htaccessの設定を有効にしていると、実際に使用しているかに関わらず、Apacheが各ディレクトリで.htaccessを探すことになるため、サーバの性能低下を招くことになります。

ではいつ使うのか

基本的には使わないほうが良い理由は上記の通りですが、ではいつ使うのかというと、サーバの主設定ファイルにアクセスできない場合です。主設定ファイルとは今回の場合はhttpd.confを指します。基本的に.htaccessに書くような設定はhttpd.confにも同様に記述することが出来ます。

TOWNではお客様のサーバのApacheの設定はTOWNが管理してます。
なのでお客様がリダイレクトやアクセス制限、BASIC認証などの設定を入れたいときは.htaccessを使用しています。
コンテンツがおかしくなったときなどは、お客様が設定した内容を読み解く必要があります。
そのため知識が必要になってきます。

.htaccessを使ってみよう

今回は以下のような環境で行います。

  • Centos7系
  • Apache2.4.6 (CentOS)

まずはブラウザから自分のインスタンスのIPアドレスにログインして、Apacheのテストページが閲覧出来ることを確認しましょう。

.htaccessの動作を見るために、適当に/var/www/html/にページを追加していきます。
まずはディレクトリを移動しましょう

$ cd /var/www/html

testtest3というディレクトリを作成して、test/の下にvivimなどのエディタを使ってhtmlファイルなどを作ります。
例で以下のような構造で作成しました。

├── test
│   ├── hello.html
│   ├── index.html
│   └── test2
│       └── hello2.html
└── test3
    └── index.html

htmlファイルの中身は、見た目でわかりやすいように、indexやhelloと記述しておくとわかりやすいですね。

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
</head>

<body>
    indexだよー!
</body>
</html>

次に.htaccessを有効にしていきましょう。
httpd.confに追記していきます。

$ vi /etc/httpd/conf/httpd.conf

<Directory /var/www/html>
AllowOverride All #ここをNone から All に変更
<Directory>

IPアドレスでのアクセス制限をかけよう

自分のインスタンスで公開しているwebページにIPアドレスでのアクセス制限をかけていきましょう。
test/ディレクトリ下に.htaccessを作成し、今使用しているパソコンからのアクセスのみを許可する設定を記述してきます。
今使用しているパソコンのIPアドレスはWhat’s My IP Address?にアクセスして確認してください。

$ vi test/.htaccess


<RequireAll>
Require ip [確認したIP]
</RequireAll>

変更したあとは、Apacheを再起動しましょう

$ sudo systemctl restart httpd

Require ip [確認したIP]で確認したIPからのアクセスは許可しています。
試しに今使っているパソコンから[インスタンスのIP]/test/にアクセスしてみましょう。
これは見ることが出来ます。

次に4G回線などの別のインターネットに繋がっているスマートフォンなどから同じページにアクセスしてみましょう。

アクセスが拒否されていますね。 この.htaccessの有効範囲ですが、前述の通りその配下にある全ディレクトリに影響があります。
以下のような構造の場合hello.html,index.html,hello2.htmlに影響があります。
test3のindex.htmlに影響はありません。

├── test
│   ├── .htaccess
│   ├── hello.html
│   ├── index.html
│   └── test2
│       └── hello2.html
└── test3
    └── index.html

BASIC認証をかけてみよう

BASIC認証とは、あらかじめユーザ名とパスワードを登録しておき、特定のディレクトリ以下にアクセスがあれば認証を求める仕組みです。 簡易的な仕組みの認証なので、あくまで一時的なものにしておいたほうが安全です。

先程作成した.htaccessを削除しましょう。
アクセス制限と競合するのを防ぐためです。

$ cd /var/www/html
$ sudo rm test/.htaccess

ユーザ名とパスワードを登録します。以下のコマンドで作成することが出来ます。

$ sudo htpasswd -c /var/www/html/test/.htpasswd user1
New Password:

user1の部分がユーザ名になります。New Password:にパスワードを入力します。今回はtest1とでもしておきましょう。
作成した.htpasswdの権限とパーミッションを変更します。

#権限変更
$ sudo chown apache:apache /var/www/html/test/.htpasswd
#パーミッション変更
$ sudo chmod 600 /var/www/html/test/.htpasswd

では新たに.htaccessを作成して、BASIC認証の設定を記述します。

$ sudo vi test/.htaccess

AuthType basic
AuthName "private area"
AuthUserFile /var/www/html/test/.htpasswd
Require valid-user

変更したあとは、Apacheを再起動しましょう

$ sudo systemctl restart httpd

実際にアクセスしてみましょう 認証を求めるポップアップが出てきますね。

先程登録した情報を入力すると、認証され閲覧することが出来ます。

リダイレクト処理をしてみよう

サイトのお引越しや、http://でアクセスしてきたユーザをhttps://に飛ばすなど、様々なところでリダイレクトは使われます。
リダイレクトは使い方によっては混乱を招くので、使い方を間違えないようにしましょう。 => 国税庁Webサイト、全URL変更で混乱 サイト内検索も役立たず、「無限ループ」状態に

今回はtestディレクトリ下のhello.htmlのアクセスを同ディレクトリのindex.htmlにリダイレクトさせましょう。 .htaccessファイルを編集していきます。

$ sudo vi test/.htaccess

RewriteEngine on
RewriteRule ^hello.html$ http://18.178.229.60/test/index.html [L,R=301]

まぁindex.htmlは書かなくても、デフォルトでindex.htmlを参照するようになっているのでtest/までで終わらせても良いんですけどね。
変更したあとは、Apacheを再起動しましょう

$ sudo systemctl restart httpd

実際にtest/hello.htmlにアクセスすると、test.htmlにリダイレクトされるのが確認できるかと思います。
ここで記述を間違えた、他のページにリダイレクトさせたいなどの理由でリダイレクトの設定を書き換えても、以前の設定が残ったままになっていることがあります。
この場合はブラウザのキャシュクリアを試してください。


課題

1 .htaccessを使って、特定のIPアドレスからのアクセスを制限をしよう

例えばすべてのIPアドレスのアクセスは許可するけど、特定のIPアドレスのみはブロックするなど。 特定のIPアドレスはスマホなどのIPアドレスを用いると、判断しやすいですね。

2 任意のページにBASIC認証をかける

課題1で設定したIPアドレスはブロックしつつ、BASIC認証をかけてみましょう。

2.1 以下の情報でBASIC認証をかける

ユーザー名 : user1 パスワード : test1

2.2 追加で以下のユーザを作成する

ユーザー名 : user2 パスワード : test2

2.3 下記ユーザを削除する

ユーザー名 : user1 パスワード : test1

3 .htaccessを使って任意のページにリダイレクト処理をする。

任意のページをハックノートのページにリダイレクトしてみましょう。 => https://hacknote.jp/