Rewrite(リダイレクト) 無限ループの回避方法

2021-06-21

概要

最近、Apacheでmod_rewriteを使いWEBサイトがあって、無限ループになってハマってしまいました
回避方法はネットでは[L]を追加する方法が紹介されていました

[L]を使用してループを止める

[L]のオプションを使用していると、それ以降の条件では比較しないと解釈になりリダイレクトが終了します

  1. 接続要求あったら、http://www.example.co.jp/」へリダイレクトする
  2. [L]の条件にマッチするので処理終了するのでループしない

上記のような流れです

#変更前
<VirtualHost *:80>
    DocumentRoot /var/www/html
    ServerName www.hoge.com
    ErrorLog logs/www_hoge_com.log
    CustomLog logs/www_hoge_com.common_log
    RewriteEngine on
    RewriteRule http://www.hoge.com/
    RewriteRule ^/(.*)$ http://www.hoge.com/? [R]
</VirtualHost>

#変更後 [L]を追加します
<VirtualHost *:80>
    DocumentRoot /var/www/html
    ServerName www.hoge.com
    ErrorLog logs/www_hoge_com.log
    CustomLog logs/www_hoge_com.common_log
    RewriteEngine on
    RewriteRule http://www.hoge.com/ - [L] ← 追加
    RewriteRule ^/(.*)$ http://www.hoge.com/? [R]
</VirtualHost>

[RewriteCond]を使用してループを止める

上記ではRewriteRuleを使用する方法を紹介しましたが、筆者の環境ではうまく動きませんでした。筆者の環境でループ止める事ができたのは、 [RewriteCond] を使用する方法です

[RewriteCond:書式]
RewriteCond テストする変数 パターン [フラグ]
フラグには[NC]もしくは[OR]を指定できます。フラグを二つ設定するにはカンマで区切ります。(例: [NC, OR]

[NC] – 大文字小文字を区別せずにパターンと一致するかどうかをテストします。
[OR] – いずれかのRewriteCondにあてはまる場合にRewriteRuleを適用します。[OR]を明示しない場合、自動でANDになります。

#変更前
<VirtualHost *:80>
    DocumentRoot /var/www/html
    ServerName www.hoge.com
    ErrorLog logs/www_hoge_com.log
    CustomLog logs/www_hoge_com.common_log
    RewriteEngine on
    RewriteRule http://www.hoge.com/
    RewriteRule ^/(.*)$ http://www.hoge.com/? [R]
</VirtualHost>

#変更後 [L]を追加します
<VirtualHost *:80>
    DocumentRoot /var/www/html
    ServerName www.hoge.com
    ErrorLog logs/www_hoge_com.log
    CustomLog logs/www_hoge_com.common_log
    RewriteEngine on
    RewriteCond %{REQUEST_URI} !^/$← 追加(無限ループ回避、トップページへのアクセスはリダイレクトをかけない)
    RewriteRule http://www.hoge.com/
    RewriteRule ^/(.*)$ http://www.hoge.com/? [R]
</VirtualHost>

LinuxApache

Posted by admin