目次
.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
test
とtest3
というディレクトリを作成して、test/
の下にvi
やvim
などのエディタを使って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/