mod_rewriteに苦戦したので、書く。
環境は、CentOs5.3
http://www.hoge/312
というアドレスに行くと、
http://www.hoge/index.php?q=312
というページが読み込まれるようにしたい。
そこで、htaccessの使い方を調べて、書いたのがこれだ。
RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([0-9]+)$ index.php?q=$1 [L]
すると、404エラーが返ってきた!
どういうことなの・・と思いつつ、
RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([0-9]+)$ /index.php?q=$1 [L]
と書いたら成功した。どういうことなの・・・
転送先のuriの先頭に/を付けただけです。
まぁ、ってことで無事できました。結果オーライ!
単純に書き間違いとかは、500エラーで返ってくるからわかるよ!
調べるより、現状どうapacheさんが処理しているのかを見る方が良いかも!つまり、ログを出力させる。
Apacheの設定ファイルを書き替える
vim /etc/httpd/conf/httpd.conf
で、それの最終行に
RewriteLog "tmp/rewrite.log" RewriteLogLevel 9
と記述する。ログ情報がフルに出力されるから、デバッグが終わったらこれは必ず消しましょう。
【細かい事】
httpd.conf の中の AllowOverrideはAllにすること。私の場合は、関係ありそうな所全部のOverrideをAllにしました。
.htaccess の改行コードは必ず LF(UNIX)にすること!
転送の時は、個別設定で必ずアスキー(Ascii)にすること!
これで出来るはず。
追記:
RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([0-9]+)$ /index.php?q=$1 [L]
これの最終行に [QSA] というパラメータをつけると
RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([0-9]+)$ /index.php?q=$1 [QSA] [L]
複数のパラメータが取得できます
こうすると
hoge.com/archive?err=3
とかアクセスが来たときに、
hoge.com/index.php?q=archive&err=3
に飛ばせる。 便利!
参考にさせていただいたサイト:
mod_rewriteのインストール・設定 – RewriteRuleのサンプル [Fedora, RedHat, CentOS]