mod_rewriteを試してみる

CentOSにPHPのとりあえずの開発環境を作成してみる
の続き

mod_rewriteを試してみる。

.htaccessを有効にする

.htaccessを使うので、有効にする。

$ sudo vi /etc/httpd/conf/httpd.conf
<Directory "/var/www/html">
・・・
AllowOverride None
↓
AllowOverride All
$ sudo service httpd restart

index.php

確認用のindex.phpを用意する。

<?php
echo $_SERVER["REQUEST_URI"];
echo '<br />';
print_r($_GET);

http://サーバーのアドレス/index.php
にアクセスすると、下記のように表示される。

/index.php
Array ( )

http://サーバーのアドレス/hoge
にアクセスすると、当然のことながらNot Foundになる。

Not Found

mod_rewriteを試す

下記のような.htaccessを設置すると、
index.phpにアクセスするようになる。

<IfModule mod_rewrite.c>
	RewriteEngine On
	RewriteRule ^ index.php
</IfModule>

http://サーバーのアドレス/hoge

/hoge
Array ( )

GETのパラメタに渡す場合

GETのパラメータに渡す場合は$1を指定する。
しかし、
Array ( [param] => hoge/ )
となると思ったが、なぜかindex.phpが渡された。

<IfModule mod_rewrite.c>
	RewriteEngine On
	RewriteRule ^(.*)$ index.php?param=$1
</IfModule>

http://サーバーのアドレス/hoge

/hoge/
Array ( [param] => index.php )

[QSA]を指定すると、hoge/が渡されるようになった。
よく分からない。

<IfModule mod_rewrite.c>
	RewriteEngine On
	RewriteRule ^(.*)$ index.php?param=$1 [QSA]
</IfModule>

http://サーバーのアドレス/hoge

/hoge/
Array ( [param] => hoge/ )

L

RewriteRuleが複数ある場合、下記の書き方だと、
全てのルールが適用される。

<IfModule mod_rewrite.c>
	RewriteEngine On
	RewriteRule ^(.*)$ index.php?param=$1 [QSA]
	RewriteRule ^(.*)$ index.php?param2=$1 [QSA]
</IfModule>

http://サーバーのアドレス/hoge

/hoge/
Array ( [param2] => index.php/ [param] => hoge/ )

Lを指定すると、マッチした場合そこで終了する。

<IfModule mod_rewrite.c>
	RewriteEngine On
	RewriteRule ^(.*)$ index.php?param=$1 [QSA,L]
	RewriteRule ^(.*)$ index.php?param2=$1 [QSA]
</IfModule>

http://サーバーのアドレス/hoge

/hoge/
Array ( [param] => hoge/ )

ファイルが存在する場合

index.phpと同じ場所にhoge.phpを作成する。

<?php
echo 'HogeHoge';

.htaccessが下記の状態だと、index.phpに飛ばされる。

<IfModule mod_rewrite.c>
	RewriteEngine On
	RewriteRule ^ index.php
</IfModule>

http://サーバーのアドレス/hoge.php

/hoge.php
Array ( )

RewriteCond %{REQUEST_FILENAME} !-f
を指定すると、ファイルが存在する場合は、
ファイルにアクセスするようになる。

<IfModule mod_rewrite.c>
	RewriteEngine On
	RewriteCond %{REQUEST_FILENAME} !-f
	RewriteRule ^ index.php
</IfModule>

http://サーバーのアドレス/hoge.php

HogeHoge

ディレクトリが存在する場合

hogeディレクトリを作って、
hoge/index.phpを作成する。

<?php
echo 'HogeHoge';

.htaccessが下記の状態だと、index.phpに飛ばされる。

<IfModule mod_rewrite.c>
	RewriteEngine On
	RewriteCond %{REQUEST_FILENAME} !-f
	RewriteRule ^ index.php
</IfModule>

http://サーバーのアドレス/hoge

/hoge/
Array ( )

RewriteCond %{REQUEST_FILENAME} !-d
を指定すると、ディレクトリが存在する場合は、
ディレクトリにアクセスするようになる。

<IfModule mod_rewrite.c>
	RewriteEngine On
	RewriteCond %{REQUEST_FILENAME} !-d
	RewriteCond %{REQUEST_FILENAME} !-f
	RewriteRule ^ index.php
</IfModule>

http://サーバーのアドレス/hoge

HogeHoge