フレームワークとかなんとかPressでありがちな
リクエストされたURLを処理をする奴をメモしておく。
(リクエストルーターって言うらしいよ!)
今回は
http://example.com/alpha/bravo/charlie/
を
http://example.com/index.php?request=/alpha/bravo/charlie/
にして
array(3) {
[0]=> string(5) "alpha"
[1]=> string(5) "bravo"
[2]=> string(7) "charlie"
}
にする一通り。
肝心のファイルはこれ。
.htaccess
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www.example.com
RewriteRule ^(.*)$ http://example.com/$1 [R=301,L,NE]
RewriteCond %{REQUEST_URI} ![&]
RewriteCond %{REQUEST_URI} !/$
RewriteCond %{REQUEST_URI} !\.[^/\.]+$
RewriteRule .* %{REQUEST_URI}/ [L,R]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (.*) index.php/?%{QUERY_STRING}&request=$1 [L]
RewriteCond %{THE_REQUEST} ^GET\ !-f
RewriteRule ^(.*)index.php/?(.*)$ http://example.com/$1$2 [R=301,L,NE]
</IfModule>
よく使うので書いてますがここはwwwの有り無しを揃える為なので要らないです。
RewriteCond %{HTTP_HOST} ^www.example.com
RewriteRule ^(.*)$ http://example.com/$1 [R=301,L,NE]
これもwwwと同じような理由で、末尾に/ (スラッシュ)がない時に付けてあげてURLを揃えてる。
RewriteCond %{REQUEST_URI} ![&]
RewriteCond %{REQUEST_URI} !/$
RewriteCond %{REQUEST_URI} !\.[^/\.]+$
RewriteRule .* %{REQUEST_URI}/ [L,R]
大事なのはここ
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (.*) index.php/?%{QUERY_STRING}&request=$1 [L]
- ファイルをリクエストしている場合は処理しない
- /(ルート)より後ろを全部$1に渡してる
- ?%{QUERY_STRING} もポイント。元から付いてるGETを改めて付け直してる。
http://example.com/alpha/?bravo=charlie
のような時に
http://example.com/index.php?bravo=charlie&request=/alpha/
としてくれる
PHP で $_GET['request'] を処理する
これだけ。
index.php
$request = array_values(array_filter(explode('/', $_GET['request']), "strlen"));
- / (スラッシュ)でexplodeして配列化
- URL構造の関係上、空配列が出来るのでarray_filterで整理
以上!