rewriterule すぐ忘れるので覚書 

mod_rewriteのインストール・設定
mod_rewriteは、Apacheの機能で、モジュールを組み込むことで利用できます。
URL(ドメイン以下のパス)のリダイレクトや偽装、置き換えなどが行えます。
一般的な正規表現を利用してRewriteRuleを書くことができます。
正規表現については、正規表現関連のページを参照して下さい。
インストール
Apache2.xの場合は、Apacheのインストール時の./configureに
–enable-so –enable-rewrite=shared
を付けて、その後makeします。
バージョンによって書き方が多少違います。
Apache・aprのインストール・設定を参照。

その後、Apacheのmodulesディレクトリにmod_rewrite.soがあるか確認。
httpd.confに
LoadModule rewrite_module modules/mod_rewrite.so
という1行を追加。
最初から書いてあればそのまま。
コメントアウトされているなら外す。
RewriteRule – http.confに書く場合

RewriteEngine On
RewriteRule ^/sample/(.*)$ /shop/sample/$1 [L,R]

http.confに書く場合は、書いた後Apacheを再起動します。
RewriteRule – .htaccessに書く場合
.htaccessについては、.htaccessのサンプル・設定を参照。
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/sample/(.*)$ /shop/sample/$1

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule test\.php$ index.php?a=test
RewriteCond %{REQUEST_FILENAME} !-f は、ファイルが実在しない場合という意味。
RewriteCond %{REQUEST_FILENAME} !-d は、ディレクトリが実在しない場合という意味。
つまり、RewriteRuleに合致するファイルやディレクトリが実在する場合は、RewriteRuleを適用しなくなる。
上記の例では、test.phpが実在する場合や、実在するindex.phpにアクセスした場合は、RewriteRuleが適用されない。
RewriteCondは、上記のようにRewriteRuleごとに書かないと動作しない。

さくらインターネットのレンタルサーバでは、mod_rewriteがインストールされています。
以下のように書いて動作しています。
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule book([0-9a-zA-Z_\-]+).html$ http://sample.com/test/index.php?bookid=$1 [L]
例えば、上記ルールを書いた .htaccess を、test ディレクトリに置いた場合
http://sample.com/test/book123.html
にアクセスすると
http://sample.com/test/index.php?bookid=123
が実行される。
RewriteRule – http.conf(VirtualHost)に書く場合

ServerName www.example.com
DocumentRoot /test/htdocs
RewriteEngine On
RewriteRule ^/sample/(.*)$ /shop/sample/$1 [L]

Options Includes ExecCGI MultiViews
AllowOverride All
Order allow,deny
Allow from all


RewriteRuleの書き方・解説
RewriteRule ^/sample/(.*)$ /shop/sample/$1 [L]
の場合、
http://ドメイン名/sample/ にアクセスすると
http://ドメイン名/shop/sample/ のファイルを表示します。
ブラウザの表示は、http://ドメイン名/sample/ のままです。
http://ドメイン名/sample/test/test.php にアクセスすると
http://ドメイン名/shop/sample/test/test.php のファイルを表示します。
ブラウザの表示は、http://ドメイン名/sample/test/test.php のままです。

[L]は、定義の最終行(Last)を意味します。
この行以降のRewriteRuleは無視されます。
一番最後の行に書きます。
[L]を書かなくても動作します。

[R]は、リダイレクトを行います。

RewriteRule ^/sample/(.*)$ /shop/sample/$1 [L,R]
の場合、
http://ドメイン名/sample/ にアクセスすると
http://ドメイン名/shop/sample/ のファイルを表示します。
ブラウザの表示は、http://ドメイン名/shop/sample/ になります。
http://ドメイン名/sample/test/test.php にアクセスすると
http://ドメイン名/shop/sample/test/test.php のファイルを表示します。
ブラウザの表示は、http://ドメイン名/shop/sample/test/test.php になります。

RewriteRule ^/blog/view/([0-9]+)/?$ /blog/view/index.php?id=$1
の場合、
http://ドメイン名/blog/view/1234/ にアクセスすると
http://ドメイン名/blog/view/index.php?id=1234 を表示します。
ブラウザの表示は、http://ドメイン名/blog/view/1234/
「/」の後に「?」を入れているのは、ヤフーなどの検索エンジンでは、 URLの後ろのスラッシュを削除したURLをインデックスに登録するため、 URLの後ろにスラッシュがあってもなくてもアクセスできるようにしています。

RewriteRule ^/abc/([0-9a-zA-Z]+)/([0-9\-]+)/?$ /abc/test.php?id=$1&date=$2
の場合、
http://ドメイン名/abc/suzuki/2006-01-01/ にアクセスすると
http://ドメイン名/abc/test.php?id=suzuki&date=2006-01-01 を表示します。
ブラウザの表示は、http://ドメイン名/abc/suzuki/2006-01-01/
RewriteRule サンプル

ServerName www.example.com
DocumentRoot /test/htdocs
RewriteEngine On
RewriteRule ^/sample/(.*)$ /shop/sample/$1
RewriteRule ^/blog/view/([0-9]+)/?$ /blog/view/index.php?id=$1
RewriteRule ^/abc/([0-9a-zA-Z]+)/([0-9\-]+)/?$ /abc/test.php?id=$1&date=$2 [L]

Options Includes ExecCGI MultiViews
AllowOverride All
Order allow,deny
Allow from all

シェアする

  • このエントリーをはてなブックマークに追加

フォローする