MyProjectWEB

【apache】mod_rewriteの設定について

【apache】mod_rewriteの設定について

apache2.0でmod_rewriteを自宅のサーバーで動作させようとしたときに躓いたことをまとめてみました。

【基本的なこと】

mod_rewriteとはapacheの機能の一つでURLのリダイレクトや書き換え、偽装なんかをすることが出来ます。
apacheの設定ファイルhttpd.confに記述するか、適応させたいディレクトリに.htaccessを設置してそこにルールを記述知ることで動作させることができます。

[apacheの設定]

apacheでmod_rewriteが許可されていないとhtaccessに書こうがhttpd.confに書こうが動作はしません。
httpd.confに以下の記述があることを確認しましょう。

LoadModule rewrite_module modules/mod_rewrite.so

コメントアウトされている場合は頭の#を削除します。
記述が見つからない場合は書き足しましょう。
(修正が終わったらhttpdの再起動を忘れずに)

[ディレクティブ]

RewriteEngine
mod_rewriteを動作させるかさせないかを設定する。
RewriteBase
基本となるディレクトリを記述する。
RewriteCond
rewriteするにあたっての条件を記述
RewriteRule
rewriteのルールを記述。
RewriteLogLevel
rewriteにおけるログの出力レベルを設定する。
RewriteLog
ログの出力先を指定する。

ログの出力先とレベルの設定はhttpd.confに記述するようにしましょう。

httpd.confに以下の記述
RewriteLogLevel 9
RewriteLog /var/log/httpd/rewrite.log

携帯電話からのhttp://p-graphic.servebeer.com/test/index.htmlというアクセスをhttp://p-graphic.servebeer.com/mobile/index.htmlへリダイレクトさせる。
httpd.confに記述する場合
<Directory /動作させたいディレクトリ >
Options FollowSymLinks
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} ^(DoCoMo|KDDI|UP\.Browser|J-PHONE|Vodafone|MOT-|SoftBank) [NC]
RewriteRule /test/index.php$ /mobile/index.html [R,L]
.htaccessに記述する場合
RewriteEngine On
RewriteBase /test
RewriteCond %{HTTP_USER_AGENT} ^(DoCoMo|KDDI|UP\.Browser|J-PHONE|Vodafone|MOT-|SoftBank) [NC]
RewriteRule ^index.php$ /mobile/index.html [R,L]

【トラブルシューティング】

mod_rewriteが動かなかったり思ったように動作しないときは兎に角ログを確認しましょう。

ログの出力先とレベルの設定はhttpd.confに記述するようにしましょう。

httpd.confに以下の記述
RewriteLogLevel 9
RewriteLog /var/log/httpd/rewrite.log

httpd.confでmod_rewriteが動作しない。

  • LoadModule rewrite_module modules/mod_rewrite.soをhttpd.confに記述しましょう。
  • LoadModule rewrite_module modules/mod_rewrite.soがコメントになっている場合は頭の#を削除しましょう。
  • rewriteルールを記述する場所が間違っていませんか?
  • <Directory /動作させたいディレクトリ >の中にちゃんと記述されていますか?

htaccessでmod_rewriteが動作しない。

  • htaccessが有効になっていますか?
  • RewriteBase が正しく設定されていますか。

Options FollowSymLinks or SymLinksIfOwnerMatch is off which implies that RewriteRule directive is forbidden:
とエラーが出てしまい、mod_rewriteが適応されるディレクトリ以外のファイルへのアクセスができなくなってしまう。

  • mod_rewriteを適用するディレクトリにOptions FollowSymLinksと追記することでこのエラーは回避できます。
  • <Directory /動作させたいディレクトリ >の中にmod_rewriteの設定と共にOptions FollowSymLinksも記述しましょう。

RewriteCond を[OR]オプションを付けて続けて書くと指定したUA以外のブラウザからアクセスしてもリダイレクトされてしまう。

例)

RewriteCond %{HTTP_USER_AGENT} DoCoMo [NC,OR]
RewriteCond %{HTTP_USER_AGENT} J-PHONE [NC,OR]
RewriteCond %{HTTP_USER_AGENT} Vodafone [NC,OR]
RewriteCond %{HTTP_USER_AGENT} SoftBank [NC,OR]
RewriteCond %{HTTP_USER_AGENT} MOT- [NC,OR]
RewriteCond %{HTTP_USER_AGENT} UP.Browser [NC,OR]
RewriteCond %{HTTP_USER_AGENT} KDDI [NC,OR]
RewriteCond %{HTTP_USER_AGENT} WILLCOM [NC,OR]
RewriteRule ^index.php$ /mobile/index.html [R,L]

ではなく、こうしてひとつずつ[L]で区切ることで思い通りの動作をするようになる場合があります。

RewriteCond %{HTTP_USER_AGENT} DoCoMo [NC]
RewriteRule ^index.php$ /mobile/index.html [R,L]
RewriteCond %{HTTP_USER_AGENT} J-PHONE [NC]
RewriteRule ^index.php$ /mobile/index.html [R,L]
RewriteCond %{HTTP_USER_AGENT} Vodafone [NC]
RewriteRule ^index.php$ /mobile/index.html [R,L]
RewriteCond %{HTTP_USER_AGENT} SoftBank [NC]
RewriteRule ^index.php$ /mobile/index.html [R,L]
RewriteCond %{HTTP_USER_AGENT} MOT- [NC]
RewriteRule ^index.php$ /mobile/index.html [R,L]
RewriteCond %{HTTP_USER_AGENT} UP.Browser [NC]
RewriteRule ^index.php$ /mobile/index.html [R,L]
RewriteCond %{HTTP_USER_AGENT} KDDI [NC]
RewriteRule ^index.php$ /mobile/index.html [R,L]
RewriteCond %{HTTP_USER_AGENT} WILLCOM [NC]
RewriteRule ^index.php$ /mobile/index.html [R,L]
モバイルバージョンを終了