【Apache】Apache Rewrite/.htaccese 概要
-
カテゴリ:
- サーバ
Apache RewriteやRewriteRuleに関する簡単なメモ。
Apache Rewriteとは、リクエストされたURLに対して設定したルール(RewriteRule )に従って、リダイレクト(ページを開く/遷移)する設定をいろいろ書ける仕組みのこと。
サーバーのディレクトリ構成やファイルの有無などを悟られないように隠ぺいする時にもよく用いられます。
例えば「http://localhost/archive/2020/02/21」というURLでリクエストされたら、サーバ内の「/var/www/archive/20200221.html」へアクセスさせる!みたいなことが出ます。
すごい便利!!
設定方法は大きく分けて2通り
・各プロジェクト内に「.htaccess」という名前のファイルを配置し、そのファイル内に設定を記述する
⇒配置したディレクトリから配下のディレクトリすべてに反映される
⇒さらに配下に.htaccessがあり設定が競合した場合は、配下の設定が優先される
・apacheの設定ファイル「/etc/httpd/conf/httpd.conf」に設定を記載する
⇒プロジェクト全体に反映される?たぶn。
記述方法も2種類
・Redirect permanent
Redirect permanent / http://example.com/
・RewriteEngine
RewriteEngine On
RewriteRule ^(.*)$ http://example.com/$1 [L]
⇒RewriteEngineを使うにはmod_rewriteのモジュールを追加する必要がある
(apacheの設定ファイルでLoadModuleして!)
・オプション一覧
RewriteRuleの最後についている[L]はRewriteRuleのオプションになります。いろいろな種類があり、リダイレクトしたりアクセスをシャットダウンすることができます。
- [R]:302リダイレクトする
- [R=301]:301リダイレクトする
- [QSA]:書き換え後のURLにQueryStringが存在する場合、QueryStringが引き継がれる
例)以下の例で、 /aaa?var=1 は /replace?var=2 になるが、/bbb?var=1 は /append?var=2&var=1 になる。
RewriteRule ^aaa$ /replace?var=2 [L]
RewriteRule ^bbb$ /append?var=2 [L,QSA] - [L] = このルールにマッチしたらその後のルールは評価せず無視する。条件を複数記載する際、都度都度このオプションを付ける
- [C] = このルールにマッチした場合のみ次のルールを評価する。
- [OR]:論理和の条件。記述しない場合はRewriteCondの条件は論理積(AND)になる
- [E] = 環境変数を設定する (例: [E=HOSTID:%1_example_com])
- [F] = 403-Forbiddenエラーを返す。
- [G] = 410-Goneエラーを返す。
- [H] = 特定のMIME-タイプのリクエストは無条件で操作される。
- [N] = 書き換え後のURLをリクエストとして再度ルールを適用。無限ループに陥る場合があるので注意。
- [NC] = 大文字小文字を無視する。
- [NE] = 「.」, 「?」, 「%」などの特殊文字がデコードされるのを防ぐ。
- [NS] = サブリクエストについて評価しない
- [P] = リバースプロキシ用。
- [PT] = Alias文を適用する
- [QSA] = クエリを含むURL(http://example.com/××?param=○○ など) がリクエストされた場合、クエリ部分を書き換えてアドレスの後に追加する。
- [R] = 指定したURLにHTTPリダイレクトを行う。[R=303]のようにすることでリダイレクトコードを指定できる。
- [S] = ルールをスキップする。
- [T] = mimeタイプを指定する。
RewriteCondディレクティブを使って条件を指定
RewriteCondはURLの書き換える条件を指定できます。RewriteCondの条件に一致したURLに対して後続のRewriteRuleへリダイレクトするイメージです。
RewriteCond テスト文字列 条件パターン フラグ
よく使う例
サブドメインをメインのドメインに振り分ける例
RewriteCond %{HTTP_HOST} !^sample.com
RewriteCond %{HTTP_HOST} !^www.sample.com
RewriteRule ^(.*)$ http://sample.com$1 [QSA,R=301,L]
SSL対応を後にhttp(ポート80)のアクセスをhttps(443)へリダイレクトするサンプル
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ http://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
URLの年月日をリクエストパラメータに渡す例
RewriteRule ^/archive/([0-9]+)/([0-9]+)/([0-9]+)/$ /archive.php?year=$1&month=$2&day=$3 [L,QSA]
サーバを引っ越す際に旧サイトから新サイトへリダイレクトする例
RewriteRule ^(旧サイト)/sample1.html$ http://(新サイト)/sample1.html [R=301,L]
RewriteRule ^(旧サイト)/sample2.html$ http://(新サイト)/sample2.html [R=301,L]