11
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

mod_rewrite とは

Posted at

勉強前イメージ

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 の中身が見れる

3Mozilla Firefox 2021-10-19 21.42.48.png

  • 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 へアクセスを行います。
すると表示が変わり、リダイレクトされたことがわかりました。

4Mozilla Firefox 2021-10-19 21.43.13.png

勉強後イメージ

初めて.htaccess触ったかも
実際に触ってみたらなんとなくイメージついた気がする
ほぼデフォルト設定でしか触ったことなかったから勉強になった

参考

11
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?