「設定 - .htaccess」の版間の差分
212行目: | 212行目: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<br> | <br> | ||
以下に示す2つの設定は、全てのリクエストに対して403 Forbiddenエラーを返す。<br> | |||
したがって、Webサイト全体へのアクセスを禁止する設定である。<br> | |||
* RewriteRule .* - [F,L] | |||
* RewriteRule ^(.*)$ - [F,L] | |||
<br> | |||
後者のルールの方がより厳密である。<br> | |||
正規表現である<code>^</code>および<code>$</code>を使用することにより、URLの先頭から末尾までを完全にマッチさせる。<br> | |||
一方、前者のルールは理論的にはURLの一部分にもマッチする可能性がある。<br> | |||
<br> | |||
==== RewriteBaseディレクティブ ==== | ==== RewriteBaseディレクティブ ==== | ||
RewriteBaseディレクティブは、mod_rewriteモジュールで使用されており、その後に続く<code>RewriteRule</code>で使用される相対URLのベースパスを設定する。<br> | RewriteBaseディレクティブは、mod_rewriteモジュールで使用されており、その後に続く<code>RewriteRule</code>で使用される相対URLのベースパスを設定する。<br> |
2024年8月18日 (日) 06:02時点における版
概要
Filesディレクティブ
Apache2のセキュリティを向上させる重要なツールの1つである。
Filesディレクティブは、特定のファイルやファイルタイプに対してアクセス制御を行うために使用する。
特定のファイルやファイルタイプへのアクセスを制御することにより、機密情報の保護や不正アクセスの防止に役立つ。
- 特定のファイルへのアクセス制御
- 特定のファイル名やファイルパターンに対して、アクセス権限を設定できる。
- セキュリティ強化
- 重要なファイルや設定ファイルへの不正アクセスを防ぐ。
- 柔軟な設定
- ワイルドカードを使用して、複数のファイルに一度に適用することができる。
<Files "filename">
# ここにディレクティブを記述
</Files>
# 例 1: .htaccessファイル自体へのアクセスを拒否する場合
<Files ".htaccess">
Require all denied
</Files>
# または
<Files ~ "^.*\.([Hh][Tt][Aa][Cc][Cc][Es][Ss][Ss])$">
Order allow,deny
Deny from all
</Files>
# 例 2: 複数のファイルタイプに対して設定を適用する場合
<Files ~ "\.(php|ini)$">
Require all denied
</Files>
FilesMatchディレクティブ
FilesMatchディレクティブは、Filesディレクティブの拡張版と考えることができる。
正規表現を使用することにより、複雑なルールを簡潔に記述でき、Apache2のセキュリティと柔軟性を向上させることができる。
特に、より精密なファイルアクセス制御が必要な場合に有用である。
- 正規表現によるマッチング
- FilesMatchは正規表現を使用してファイル名やパターンにマッチするため、より柔軟で強力なマッチングが可能である。
- 複雑なパターンの指定
- 複数の条件や複雑なファイル名パターンに対して設定を適用できる。
- 効率的な設定
- 1つのディレクティブで多様なファイルタイプやパターンを指定できるため、設定がより簡潔になる。
<FilesMatch "<正規表現>">
# ここにディレクティブを記述
</FilesMatch>
# 例 1: 特定の拡張子を持つファイルへのアクセスを拒否する場合
# 指定された拡張子 (.htaccess、.htpasswd、.ini等) を持つファイルへのアクセスを拒否している
<FilesMatch "\.(htaccess|htpasswd|ini|phps|fla|psd|log|sh)$">
Require all denied
</FilesMatch>
# 例 2: 特定のパターンを含むファイル名へのアクセスを許可する場合
# "index"、"main"、"home"で始まり、".php"または".html"で終わるファイルへのアクセスを許可している
<FilesMatch "^(index|main|home)\.(php|html)$">
Require all granted
</FilesMatch>
# 例 3: 特定の文字で始まるファイルへのアクセスを制限する場合
# 数字で始まる全てのファイルへのアクセスを拒否している
<FilesMatch "^[0-9]">
Require all denied
</FilesMatch>
# 例 4: .htaccessファイルと同階層にあるhogeディレクトリ内にある全てのXMLファイルへのアクセスを拒否する場合
# サイトマップは全て閲覧可能にする
<FilesMatch "^hoge/.*\.xml$">
Require all denied
</FilesMatch>
Directoryディレクティブ
Directoryディレクティブは、Apache2の設定を細かく制御するための重要なツールである。
Directoryディレクティブは、特定のディレクトリやそのサブディレクトリに対して設定を適用するために使用する。
サイトの構造に合わせて適切に使用することにより、セキュリティ、パフォーマンス、機能性を向上させることができる。
- ディレクトリ単位の設定
- 特定のディレクトリとそのサブディレクトリに対して、一括で設定を適用できる。
- 階層的な設定
- Webサイトの構造に合わせて、異なるディレクトリに異なる設定を適用できる。
- 柔軟なアクセス制御
- 特定のディレクトリに対するアクセス権限、実行可能なスクリプト、インデックスオプション等を制御できる。
<Directory "/path/to/directory">
# ここにディレクティブを記述
</Directory>
# 例 1: 特定のディレクトリへのアクセスを制限する場合
# /var/www/html/adminディレクトリへのアクセスにおいて、特定のIPアドレス範囲とホストからのみ許可している
<Directory "/var/www/html/admin">
Require ip 192.168.1.0/24
Require host example.com
</Directory>
# 例 2: .htaccessファイルと同階層にあるhogeディレクトリおよび直下のファイル群へのアクセスを拒否する場合
# "hoge"は、.htaccessファイルからの相対パス
# "/hoge"は、ドキュメントルートからの相対パス
<Directory "hoge">
Require all denied
</Directory>
# 例 3: ディレクトリ内のPHPファイルの実行を禁止する場合
# /var/www/html/uploadsディレクトリ内のPHPファイルの実行を禁止している
<Directory "/var/www/html/uploads">
<FilesMatch "\.php$">
Require all denied
</FilesMatch>
</Directory>
# 例 4: ディレクトリインデックスを設定する場合
# /var/www/html/publicディレクトリでディレクトリリスティング (インデックス) を有効にして、見栄えの良い表示オプションを設定している
<Directory "/var/www/html/public">
Options +Indexes
IndexOptions FancyIndexing
</Directory>
# 例 5: 特定のディレクトリでのリライトルールの適用する場合
# /var/www/html/blogディレクトリ内で特定のURLパターンをPHPスクリプトにリダイレクトしている
<Directory "/var/www/html/blog">
RewriteEngine On
RewriteRule ^article-([0-9]+)\.html$ article.php?id=$1 [L]
</Directory>
mod_rewriteモジュール
mod_rewriteモジュールとは
mod_rewriteモジュールは、Apache2の非常に強力で柔軟な機能の1つである。
このモジュールを使用することにより、URLの書き換えやリダイレクトを動的に行うことができる。
mod_rewriteモジュールは正規表現を使用して柔軟なルール設定が可能であるが、複雑な設定になりがちであり、間違った設定によるパフォーマンスへの影響も考慮する必要がある。
- URL書き換え
- 複雑なURLを簡潔で覚えやすいものに変更できる。
- リダイレクト
- ユーザを別のURLに転送することができる。
- 条件分岐
- 様々な条件 (ブラウザタイプ、IPアドレス等) に基づいて異なる動作を設定できる。
- セキュリティ強化
- 特定のリソースへのアクセスを制限、または、悪意のあるリクエストをブロックすることができる。
- SEO最適化
- 検索エンジンフレンドリーなURLを作成できる。
- レガシーURLの維持
- サイト構造を変更しても古いURLを機能させ続けることができる。
RewriteEngine
mod_rewriteモジュールの機能を有効または無効にするための命令である。
以下の例では、mod_rewriteモジュールおよびRewriteRule
を有効にしている。
RewriteEngine On
RewriteCond
RewriteRule
が適用される条件を指定する。
複数のRewriteCondを指定することができる。
RewriteCond <設定の種類> <パターン> [<フラグ>]
例: HTTPホストが"www.example.com"の場合に条件が真になる
RewriteCond %{HTTP_HOST} ^www\.example\.com$
RewriteRuleディレクティブ
RewriteCond
の設定を適用する。
RewriteRule <パターン> <Substitution> [<フラグ>]
RewriteRule ^ - [L]
- この規則は、現在のURLを変更せずにそのまま処理を続行することを表す。
- [L]フラグはLastを意味しており、この規則によりRewriteエンジンの処理を停止する。
- つまり、この規則以降の他の
RewriteRule
は適用されない。
RewriteRule ^ - [F,L]
- この規則も現在のURLを変更しないが、[F]フラグによりアクセスを拒否する。
- [F]フラグはForbiddenを意味しており、403 Forbiddenステータスコードを返す。
- [L]フラグも含まれているため、この規則により処理が停止する。
# 例 1: mineo回線のアクセスを許可する場合
RewriteCond %{REMOTE_HOST} ^[\w.-]*\.mineo\.jp$ [NC]
RewriteRule ^ - [L]
# 例 2: リモートホストに".osaka."という文字列が含まれている場合は、アクセスを拒否する場合
RewriteCond %{REMOTE_HOST} ^[\w.-]*\.osaka\.[\w.-]*$ [NC]
RewriteRule ^ - [F,L]
# 例 3: "old-page.html"へのリクエストを"/new-page.html"にリダイレクトする
RewriteRule ^old-page\.html$ /new-page.html [R=301,L]
以下に示す2つの設定は、全てのリクエストに対して403 Forbiddenエラーを返す。
したがって、Webサイト全体へのアクセスを禁止する設定である。
- RewriteRule .* - [F,L]
- RewriteRule ^(.*)$ - [F,L]
後者のルールの方がより厳密である。
正規表現である^
および$
を使用することにより、URLの先頭から末尾までを完全にマッチさせる。
一方、前者のルールは理論的にはURLの一部分にもマッチする可能性がある。
RewriteBaseディレクティブ
RewriteBaseディレクティブは、mod_rewriteモジュールで使用されており、その後に続くRewriteRule
で使用される相対URLのベースパスを設定する。
RewriteBaseディレクティブが設定されていない場合は、RewriteBase
はドキュメントルートからの相対パスとなる。
RewriteBaseを適切に設定することにより、より柔軟でメンテナンスしやすいURL書き換えルールを作成することができる。
サブディレクトリでのRewriteRule
使用時において、特に重要である。
.htaccessファイルを異なる階層で再利用する場合に便利である。
- 機能
- 相対パスの解決
RewriteRule
で相対パスを使用する際の起点を定義する。
- URLの一貫性
- 異なるディレクトリ階層でも同じ
RewriteRule
を使用可能にする。
- 異なるディレクトリ階層でも同じ
- 相対パスの解決
# 例 1: "/blog/post/123"へのリクエストは、"/blog/view.php?id=123"に内部的にリダイレクトする
RewriteBase /blog/
RewriteRule ^post/(.*)$ view.php?id=$1
# 例 2: Webサイトのルートディレクトリ (例: http://example.com/) にアクセスした場合、サーバは内部的に"index.php"にリクエストを転送する
# WebブラウザにはURLの変更は表示されない (内部リダイレクト)
# "RewriteBase /"は、以降のRewriteRuleで使用される相対パスの基準点をサーバのドキュメントルート (/) に設定する
# つまり、全ての相対パスはサーバのルートディレクトリを起点として解釈される
# "RewriteRule ^$ index.php [L]"は、書き換えルールを定義している
# "^$": この正規表現は、空の文字列 (ディレクトリのルート) にマッチする
# "index.php": マッチした場合にリダイレクトされる先のファイル
# "[L]": "Last"の略であり、このルールが適用された場合、以降のルールは処理されない
RewriteBase /
RewriteRule ^$ index.php [L]
例 1: 全てのWebサイトからのリンク経由のアクセスを許可
# "RewriteCond %{HTTP_REFERER} ."は、HTTP_REFERERヘッダが存在して、かつ、空でない場合にマッチする (ドットは任意の1文字にマッチ)
# マッチした場合、"RewriteRule ^ - [L]"が適用されて、リクエストは変更されずに処理が終了する
# したがって、リファラーが存在する全てのリクエスト (他のWebサイトからのリンク経由のアクセス全て) が許可される
RewriteCond %{HTTP_REFERER} .
RewriteRule ^ - [L]
例 2: 特定のWebサイト以外からのリンク経由のアクセスを許可
# "RewriteCond %{HTTP_REFERER} !^$"は、HTTP_REFERERが空でない場合にマッチする
# "RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?example\.com [NC]"は、リファラーが指定されたドメイン (example.com) ではない場合にマッチする
# 両方の条件がマッチした場合、"RewriteRule ^ - [L]"が適用されて、リクエストは変更されずに処理が終了する
# したがって、リファラーが存在して、かつ、指定されたドメイン以外からのアクセスが全て許可される
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?example\.com [NC]
RewriteRule ^ - [L]
例 3: 特定のリモーホストのアクセスを拒否
以下の例では、リモートホストに".osaka."という文字列が含まれている場合、特定のユーザエージェント以外はアクセスを拒否している。
SetEnvIfNoCase User-Agent "Linux x86_64" linux_user_agent=1
SetEnvIfNoCase User-Agent "Linux i686" linux_user_agent=1
SetEnvIfNoCase User-Agent "Linux i686 on x86_64" linux_user_agent=1
SetEnvIfNoCase User-Agent "Linux arm" linux_user_agent=1
SetEnvIfNoCase User-Agent "Linux aarch64" linux_user_agent=1
SetEnvIfNoCase User-Agent "CrOS" linux_user_agent=1
RewriteCond %{REMOTE_HOST} ^[\w.-]*\.osaka\.[\w.-]*$ [NC]
RewriteCond %{ENV:linux_user_agent} =1 [OR]
RewriteRule ^ - [L]
RewriteCond %{REMOTE_HOST} ^[\w.-]*\.osaka\.[\w.-]*$ [NC]
RewriteRule ^ - [F,L]
Wgetコマンドラインツールからのアクセスを拒否
wgetコマンドでダウンロードする場合、ユーザエージェントにWgetという文字列が含まれている。
RewriteRule
と組み合わせて使用することにより、wgetコマンドからのアクセスを拒否することができる。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} ^Wget [NC]
RewriteRule .* - [F,L]
</IfModule>