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/ )
ファイルが存在する場合
<?php echo 'HogeHoge';
.htaccessが下記の状態だと、index.phpに飛ばされる。
<IfModule mod_rewrite.c> RewriteEngine On RewriteRule ^ index.php </IfModule>
/hoge.php Array ( )
RewriteCond %{REQUEST_FILENAME} !-f
を指定すると、ファイルが存在する場合は、
ファイルにアクセスするようになる。
<IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php </IfModule>
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