WEBアプリ開発に関する技術を綴るブログ

php,js,apache,mysql,laravel,fuelphpあたりの技術

.htaccess

.htaccessとは

Apacheの各種設定や制御を行えるようにしたファイルで、 ディレクトリ単位で設置・設定がおこなえる。

利用用途はセキュリティ対策で用いられる事が多い。

.htaccessは設置したディレクトリ以下に影響を及ぼす。 main/■■■■/★★★★の■■■■と★★★★に.htaccessを設置したら、 ★★★★ディレクトリの設定は、同じディレクトリに設置した.htaccessが優先される

どんな設定ができるのか

1.IDとパスワード認証によるアクセス制限

2.IP or ドメイン指定によるアクセス制限

3.ディレクトリ内のファイル一覧表示の中止

4.リダイレクト

1.IDとパスワード認証によるアクセス制限

パスワードを使い、ディレクトリ全体にアクセス制限を敷くことができる

準備するもの (1).htaccess ファイル (2).htpasswd ファイル(ユーザーID:パスワード(暗号化))

f:id:tanaka19880312:20180831160023p:plain

AuthName “ユーザー名とパスワードを入力してください” AuthUserFile /home/user/test … /.htpasswd AuthType Basic パスワードをかける領域名。 require valid-user 認証されたユーザにはアクセスを許可する旨の記述

AuthGroupFileはログインするグループIDとパスワードの記述ファイルのパスを指定。 (ベーシック認証では関係ないので/dev/nullでいい。

2.IP or ドメイン指定によるアクセス制限

[制限] order allow,deny ←アクセス制限 allow from all deny from viral-community.com ←独自に設定 deny from 130.90.50.120 ←独自に設定

[許可] order deny,allow ←アクセス許可 deny from all allow from viral-community.com ←独自に設定 allow from 130.90.50.120 ←独自に設定

[ファイル単体に対して指定] order deny,allow deny from all allow from 103.10.150.0

3.ディレクトリ内のファイル一覧表示の中止

ディレクトリ構造が外部に公開されないようにする

index of / の画面が表示されてファイルが見られてしまう。

.htaccessに下記を記述するだけで、ファイル一覧が表示される事はなくなる。

Options -Indexes

4.リダイレクト

サイトの引越しをして、訪問した人が自動的に旧→新に転送する設定

301リダイレクトは、永久に移動する

302リダイレクトは、一時的に移動する

a.ページ(個別)を移転した場合

RewriteEngine on (宣言) RewriteRule ^old.html$ http://www.■■■■.com/new.html [R=301,L] .htaccessファイルがold.htmlと同じディレクトリ内にある事が前提。

*URL正規化:サイトにアクセスできるURLを1つに統一しましょうというもの

*mod_rewrite:使用するとリクエストされたURLを読み替えたり、ある条件を満たした場合のみリダイレクトする

URLについて

(1)プロトコル(http, https,mailto,ftp)

対象となる事項を実行するためのルール

(2)スキーム(http://)

プロトコルというルールを規定するもの

(3)ホスト名(www)

ネットワークに接続されたホスト(機器やサーバー)の名前。 ドメインとほぼ同じ意味。

(4)ドメイン

IPアドレスを分かりやすくするために設定する文字列。 インターネット上の住所となるので、同じドメインは1つしか存在しません。

(5)ファルダ名

サーバー内のフォルダ名と位置を表しています。

(6)ファイル名

URLの末尾に配置される一番小さなファイル

URLを書き換えろ!

Apache Rewrite機能:アクセスしたURLを正規表現を使って書き換えて処理する機能

Rewrite指示子

RewriteEngine:Rewrite機能自体のオン・オフを制御

RewriteBase:Rewrite処理のベースになるURLを設定

RewriteCond:サーバ変数を参照して、それが指定した正規表現のパターンと一致していれば、次の条件を引き続き実行する

RewriteRule:URLを書き換えるための指示子

・RewriteEngine On (宣言)

アクセスのあったURLを、正規表現で書き換えてから処理する機能 使いたいそれぞれのバーチャルホストに対してRewriteEngine指示子の設定が必要です。

・RewriteCond %{HTTP_HOST} !nara-f-localhost

書式:"RewriteCond" "対象文字列(条件パターンと照らし合わせる文字列)" "条件パターン(対象文字列とマッチ(部分一致or全体一致)させるパターンを指定する部分)" URL書き換えを行うルール条件を指定するもの。RewriteRuleの前に記述する。 RewriteCondが指定するルール条件を満たす→RewriteRuleが処理される RewriteCond %{サーバ変数名} 正規表現パターン そのサーバの情報にアクセスできる変数。 環境変数名:HTTP_HOST 説明:接続先ホスト名 ["HTTP_HOST"]現在のリクエストのホスト、ヘッダーがあればその内容を返す。 正規表現:メタ文字列(meta string)( ) [ ] { } . ? + * | \,リテラル文字列(literal string)がある。

・RewriteRule ^.*$ - [R=404,L] (URL書き換え処理)

   にアクセスがあったら、    に404Not Foundを行う処理。 URL書き換えにおいて、書き換えそのものを行う構文 書式:RewriteRule パターン(わたってきたURLとマッチさせる部分) 置換対象(わたってきたURLと「パターン」がマッチした場合に、行う処理を指定)

^は行頭、 *は0回以上の繰り返し(最長一致数量子)、 .は改行以外のあらゆる一文字を表す事ができ、 $は行末、

RewriteRuleで使うフラグ

R:指定したURLにリダイレクトする。【例】R=301で301リダイレクト(redirect) L:ここでURL書き換え処理を中止し、それ以降の書き換えはしないようにする(last)

サーバーから渡されたURLが"パターン"とマッチするか確認。ここではマッチしたとすると"置換"が行われる。

特定のドメインの時だけアクセス許可し、違うドメインの場合はアクセス拒否 SetEnvIf Host "^そのディレクトリにアクセスしてもいいドメイン名$" hos_ok SetEnvifを使って環境変数の設定。 SetEnvIf 環境変数 リンク元情報 設定する環境変数

許可と拒否の順番を設定するための命令が「Order」 order deny,allow 拒否してから許可

deny from all 全てをdeny 特定のホスト以外のアクセス全てを拒否すると言う意味

allow from env=hos_ok allow で特別にアクセスを許す範囲を指定

mod_rewriteのログを書き出す方法 httpd.confで、

Apache2.2だと、 RewriteLog "/var/log/httpd/rewrite.log" RewriteLogLevel 3 のように設定する

Apache2.4以降は下記のように LogLevel alert rewrite:trace4 trace4 -> trace8 のように増やすと出力されるログが詳細になっていく。 2.4 からは RewriteLog という独立したログはなくなり、 core モジュールのLoglevel ディレクティブを使って指定する方法に変更されたため、 出力は他のログと一緒に error_log に出るようになりました。 膨大にログが出て重くなるので、 デバッグ以外の目的で trace2 以上を使うのは止めた方がよいです。