PHPの基礎【mod_Rewrite】アクセスをリライトする

今回はフレームワークやCMSを使う上で欠かせないリライトの仕組みを説明します。

.htaccessという特殊なファイルを作ってApacheWEBサーバの挙動をコントロールしてみます。
サンプルはわかりやすくいらないものを削除して最低限の記述のみしています。

まず、リライトとは何かというと

/web/phprerite/

というフォルダーを作りサイトを構築するとします。
この中にはいろいろな仕組みを持ったフォルダーがあり、外部からはアクセスさせずに、一旦すべてのアクセスをコントロールしてindex.phpで受けさせるようにしたいとします。

 

つまり

 

・/web/phprewrite/

・/web/phprewrite/hoge

・/web/phprewrite/fuga.php

・/web/phprewrite/anywords

 

これらのどのアドレスでアクセスしてもindexページにリクエストが行くようにしてみます。

まずフォルダーを作ります。
/web/phprerite/

その中にindex.phpを以下の内容で作ります。

<html>
<body>
    <h1><?php echo($_SERVER[‘REQUEST_URI’]);?>でアクセスがありました。</h1>
</body>
</html>
$_SERVER[‘REQUEST_URI’]というこれまた見慣れない変数が出てきました。
深く考えずにブラウザーからの要求がこのURL文字列で来てますよ。ということをApacheが把握しており、「PHPなどのスクリプトで呼び出せば見ることが可能になる」とだけ覚えておけば大丈夫です。
.htaccessファイルを作ります。
テキストエディターで拡張子なしや「.」(ドット)で始まるファイルが保存できない場合はいったん他の名前で保存して、リネームしてください。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^ index.php [L]
</IfModule>
これを日本語で訳すと
<IfModule mod_rewrite.c>//Apacheモジュールがあったら </IfModule>までの間に書いたことを実行しろ
RewriteEngine On//リライトを実行せよ
RewriteRule ^ index.php [L]//すべてのアクセスをindex.phpに向かわせろ([L]は「以上」の意味)
</IfModule>

という命令になります。
この命令はApacheがこのフォルダー以下すべてに適用してきます。

このあたりの設定はサーバ環境を構築する担当者が実際には行うのであくまでこの説明のための省略した記述です。

では、実際にアクセスしてみましょう。

・/web/phprewrite/

・/web/phprewrite/hoge

 

.web/phprewrite/fuga.php

/web/phprewrite/anywords

 

きちんと。表示されますね。

不思議ですよね。HTMLだけで作ったときはそういう名前のフォルダーがなければエラーになっていたはずです。
.htaccessを作ることにより置いたフォルダー以下のアクセスは切り離されるようになるんです。

http://localhost/web/phprewrite/に置いたのでこのアドレスの最後の「/」以降はすべてアドレスとして認識ではなく、データとして受け渡しはするが呼び出されるファイルは指定したindex.phpになるというわけです。(かなりざっくりですがここまでの理解でデザインはいけます)

では実際にsystemというフォルダーに実際表示させたいファイルを格納しindex.phpからそれを呼び出して表示させるサンプルを作りましょう。

 

フォルダー構成はこうなります

/phprewrite
┣/system
┃┣contents1.php
┃┣contents2.php
┃┣contents3.php
┃┗nav.php
┣index.php
┗.htaccess

まずindex.phpを書き換えます。

<?php
if($_SERVER[‘REQUEST_URI’] == ‘/web/phprewrite/’){
require(‘./system/contents1.php’);
}elseif($_SERVER[‘REQUEST_URI’] == ‘/web/phprewrite/2’){
require(‘./system/contents2.php’);
}elseif($_SERVER[‘REQUEST_URI’] == ‘/web/phprewrite/3’){
require(‘./system/contents3.php’);
}else{
echo(‘<html><body><h1>そんなページはありません</h1></body></html>’);
}
?>

if()が出てきました。これは条件を分岐するときの関数です。
日本語で訳してみましょう。

<?php
もし($_SERVER[‘REQUEST_URI’] ‘/web/phprewrite/’だったら){ここから
require(‘./system/contents1.php’);ここまでを実行してください

}前の条件に合わなくてもし($_SERVER[‘REQUEST_URI’] ‘/web/phprewrite/2’だったら){ここから
require(‘./system/contents2.php’);ここまで実行してください

}前の条件に合わなくてもし($_SERVER[‘REQUEST_URI’] ‘/web/phprewrite/3’だったら){ここから
require(‘./system/contents3.php’);ここまで実行してください

}どの条件にも合わなかったら{ここから
echo(‘<html><body><h1>そんなページはありません</h1></body></html>’);ここまで実行してください
}
?>

という意味です。今回は<?phpから?>までが長いので途中で改行が入っています。

ではsystemという名前でフォルダーを作り以下の4つのファイルを設置します。

contents1.php

<html>
<body>
<?php include(‘./system/nav.php’); ?>
<h1>インデックスページ</h1>
</body>
</html>

contents2.php

<html>
<body>
<?php include(‘./system/nav.php’); ?>
<h1>2ページ目</h1>
</body>
</html>

contents3.php

<html>
<body>
<?php include(‘./system/nav.php’); ?>

<h1>3ページ目</h1>
</body>
</html>

nav.php

<table>
<tr>
<td>
<a href=”./”>インデックスページ</a></td>
<td>
<a href=”./2″>2ページ目</a></td>
<td>
<a href=”./3″>3ページ目</a></td>
</tr>
</table>

では、インデックスページを見てみましょう。

http://localhoset/phprewrite/でアクセス

2ページ目、3ページ目もナビでクリックして確認してください。

今回は、指定のアドレス以外からのアクセスはエラーページを出すようにしたので確認してみます。

http://localhoset/phprewrite/hoge/でアクセス

ちゃんと怒られましたね。

 

実はもうこれがMVCモデルなんです。これだけで。
データベースの接続がないのでモデルはありませんが

index.phpがコントローラー、system内のファイルがビューに当たります。
このサーバ内の動きが把握できてないとフレームワークでデザインするのに苦労します。
私も初めて見たときは戸惑いました。

さて、最低限のPHPの知識はこれで十分です。次回から残りアプリ、composerやnode、開発ツールVScodeなどを入れて、いよいよLaravel本体をインストールしていきます。