メモ
http://memorva.jp/memo/linux/mod_rewrite.php
■mod_rewriteのインストール・設定
http://memorva.jp/memo/linux/mod_rewrite.php
■mod_rewriteのインストール・設定
-
mod_rewriteは、Apacheの機能で、モジュールを組み込むことで利用できます。
Apacheについては、Apache・aprのインストール・設定 を参照。
URL(ドメイン以下のパス)のリダイレクトや偽装、置き換えなどが行えます。
一般的な正規表現を利用してRewriteRuleを書くことができます。
正規表現については、正規表現関連のページを参照して下さい。 -
インストール関連情報
rpm 、 yum、apt-get 、 tar.gz 、 make install 、 シェル・環境変数 。 -
インストール
Apache2の場合は、./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に書く場合
<IfModule mod_rewrite.c>
http.confに書く場合は、書いた後Apacheを再起動します。
RewriteEngine On
RewriteRule ^/sample/(.*)$ /shop/sample/$1 [L,R]
</IfModule>
-
RewriteRule - .htaccessに書く場合
.htaccessについては、.htaccessのサンプル・設定 を参照。
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f は、ファイルが実在しない場合という意味。
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} !-d は、ディレクトリが実在しない場合という意味。
つまり、RewriteRuleに合致するファイルやディレクトリが実在する場合は、RewriteRuleを適用しなくなる。
上記の例では、test.phpが実在する場合や、実在するindex.phpにアクセスした場合は、RewriteRuleが適用されない。
RewriteCondは、上記のようにRewriteRuleごとに書かないと動作しない。
レンタルサーバのさくらインターネットでは、mod_rewriteがインストールされています。
以下のように書いて動作しています。RewriteEngine on
例えば、上記ルールを書いた .htaccess を、test ディレクトリに置いた場合
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule book([0-9a-zA-Z_\-]+).html$ http://sample.com/test/index.php?bookid=$1 [L]
http://sample.com/test/book123.html
にアクセスすると
http://sample.com/test/index.php?bookid=123
を処理する。 -
RewriteRule - http.conf(VirtualHost)に書く場合
<VirtualHost 192.168.1.2>
ServerName www.example.com
DocumentRoot /test/htdocs
RewriteEngine On
RewriteRule ^/sample/(.*)$ /shop/sample/$1 [L]
<Directory "/test/htdocs">
Options Includes ExecCGI MultiViews
AllowOverride All
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
-
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は無視されます。
一番最後の行に書きます。
何も書かなくてもOK。
[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 サンプル
<VirtualHost 192.168.1.2>
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]
<Directory "/test/htdocs">
Options Includes ExecCGI MultiViews
AllowOverride All
Order allow,deny
Allow from all
</Directory>
</VirtualHost>

