mod_rewrite www.site.com/dir/ --> www.site.com/dir/2009/

mod_rewrite www.site.com/dir/ --> www.site.com/dir/2009/

この書き換えで問題があります。これまで mod_rewrite を使用したことがなく、正規表現の経験もあまりありません。どなたか助けていただければ幸いです。

<IfModule mod_rewrite.c>
Options +FollowSymLinks
RewriteEngine on
#prevent nested looping
RewriteCond %{ENV:REDIRECT_STATUS} ^$
#re-route incoming requests
RewriteRule ^(.*)$ %{REQUEST_URI}2009/$1 [L,NE]
</IfModule>

これは部分的には機能しますが、http://www.site.com/dir/ルーティングされるhttp://www.site.com/dir/2009/しかし、次のようなリクエストhttp://www.site.com/dir/css/theme.css失敗します。親ディレクトリへのすべてのリクエストを 2009 サブディレクトリに書き直したいのですが、無限ループとサーバー エラー メッセージが繰り返し発生します。役に立つ例はまだ見つかっていません。これは一般的な書き直しになるだろうと思いました...

前もって感謝します!

答え1

例の書き換えルールには問題がいくつかあります。まず第一に、それはあなたが望むことを実際には行いません -%{REQUEST_URI}ビットは必要ありません。元のパスでは、/dir/css/theme.cssREQUEST_URI には が含まれ、$1 には( に一致)/dir/css/theme.cssが含まれ、最終的な URL は になります。したがって、次の RewriteRule が残る部分を削除する必要があります。css/theme.css(.*)/dir/css/theme.css2009/css/theme.css%{REQUEST_URI}

^(.*)$ 2009/$1 [L,NE]

それ/dir/css/theme.cssは に変換されます/dir/2009/css/theme.css

ただし、このルールにはまだ問題が 1 つあります。(.*) はどの URL とも一致するため、無限のネストが発生します。最初のステップでは、サンプル URL が に書き換えられます。/dir/2009/css/theme.css新しい URL/dir/2009/css/theme.cssもルールに一致するため、再度書き換えられ、その後も何度も書き換えられます...

基本的に、すでに書き換えられたURLの書き換えを防ぐものが必要です。URLにすでに次の内容が含まれている場合は、/dir/2009Apacheにそのままにしておく必要があります。これを実現する1つの方法は、書き換えルールに次の条件を追加することです。

RewriteCond %{REQUEST_URI} ^(?!/dir/2009).*$

最終的な.htaccessファイルは次のようになります

<IfModule mod_rewrite.c>
    Options +FollowSymLinks
    RewriteEngine on
    RewriteBase /dir
    RewriteCond %{REQUEST_URI} ^(?!/dir/2009).*$
    #re-route incoming requests
    RewriteRule ^(.*)$ 2009/$1 [L,NE]
</IfModule>

別の方法としては、 dir/2009 ディレクトリに .htacess ファイルを作成し、次のような内容で Apache が親ディレクトリのファイルを使用しないようにしますRewriteEngine off。または、RewriteEngine onルールを何も指定しなくても同様に機能するはずです。

関連情報