勉強前イメージ
httpに関係する・・?ってくらいしかわかってない
調査
mod_rewrite とは
apacheで利用されているモジュールで、URLの書き換えやリダイレクト処理を行ってくれるものです。
正規表現を使用してURLの書き換えが可能なので複雑な処理が実施できます。
例えば、httpヘッダーやタイムスタンプ、DBの情報を元にURLの書き換えができ、動的なURLを静的なURLへ変更もできます。
ユースケースでは、
ブラウザを元にアクセスを振り分けたり、
条件に合ったURLでアクセスが来た場合に、指定したURLにリダイレクトさせたりできます。
変更方法
- httpd.conf へ記載
- サーバ単位でのリダイレクト処理が可能
- .htaccessと比べると高速に処理が可能
- root権限が必要(レンタルサーバでは難しいかも)
- .htaccess へ記載
- ディレクトリ単位でのリダイレクト処理が可能
- httpd.confと比べると処理が遅い
- root権限がなくても使用可能
mod_rewrite の記載の種類
記載の種類には以下のようなものがあります。
- RewriteEngine
mod_rewriteを有効もしくは無効にする宣言文で、
有効: RewriteEngine on
/ 無効: RewriteEngine off
で有効無効を記載できます。
- RewriteBase
URL書き換える際に、ベースとなるディレクトリを明示的に指定するもので、
RewriteBase /directory
と記載すると
/directory ディレクトリ配下のURLを変更することができます。
- RewriteCond
サーバ変数を参照して、正規表現のパターンに一致していれば次の条件を実施することが出来るようなものです。
例えばAndroidを条件とすれば RewriteCond %{HTTP_USER_AGENT} Android
と記載することで
Androidに次に記載する条件を加えることができます。
- RewriteRule
URLを書き換えるためのもので、パターンにマッチした場合にURLの書き換えが行われます。
例えば、RewriteCondで条件を絞られたアクセスに対し、www.example.comで来てたものをexample.comでアクセスさせるために
RewriteRule ^(.*)$ https://example.com/$1 [R=301,L]
と記載します。
ちなみに R=
とか L
の意味に関しては、
L
はルールの最終行(Last)を意味し、ルールが一致した場合それ以降のルールは処理されません。
R
はリダイレクトを意味し、 リダイレクトを行う際HTTPステータスコードを指定できる。何も指定しない場合は通常302がデフォルトとである。
やってみる
適当なwebサーバ立ててみました。
2ファイルを /var/www/html配下においています。
noredirect.html にアクセスをさせて、特定条件下では redirect.html にアクセスされるようにします。
# tree
.
├── noredirect.html → リダイレクトされないときに表示されるもの
└── redirect.html → リダイレクトされたときに表示されるもの
それぞれの中身は以下になります。
# cat noredirect.html
リダイレクトされないよ
# cat redirect.html
リダイレクトされるよ
- 変更前
http://example.com/noredirect.html
へアクセス
何も設定されていないので、 noredirect.html の中身が見れる
- httpd.confの設定変更
※今回の設定は.htaccessの挙動を見たいだけなので、以下のように全許可してますが
環境により適切に設定してください。
apacheはデフォルトで、.htaccessの設定を有効にしていないので、
許可する設定に書き換えます。
vi /etc/httpd/conf/httpd.conf
ファイルを置いてるのは /var/www/html
なので、
設定の中の AllowOverride None(上書きを許可しない設定)
を All
に書き換えます。
<Directory "/var/www/html">
...
AllowOverride None
↓
AllowOverride All
...
</Directory>
apacheを再起動します。
service httpd restart
- 設定変更
変更したいディレクトリ配下(今回であれば /var/www/html) に.htaccess のファイルを作成して、中身を記述していきます。
vi .htaccess
中身に記載しているのは、
どのファイルへのアクセスが来ても(^.*$)、 redirect.html へリダイレクトする という風に書いています。
RewriteEngine on
RewriteRule ^.*$ redirect.html
- 変更後
変更前同様に http://example.com/noredirect.html
へアクセスを行います。
すると表示が変わり、リダイレクトされたことがわかりました。
勉強後イメージ
初めて.htaccess触ったかも
実際に触ってみたらなんとなくイメージついた気がする
ほぼデフォルト設定でしか触ったことなかったから勉強になった