この書き換えで問題があります。これまで 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.css
REQUEST_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/2009
Apacheにそのままにしておく必要があります。これを実現する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
ルールを何も指定しなくても同様に機能するはずです。