我在重寫時遇到了麻煩。我以前從未真正使用過 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}
一點。對於像 REQUEST_URI 這樣的原始路徑,/dir/css/theme.css
將包含/dir/css/theme.css
$1,並且 $1 將包含css/theme.css
(與 匹配(.*)
),最終 URL 為/dir/css/theme.css2009/css/theme.css
。所以我們需要去掉留下%{REQUEST_URI}
以下 RewriteRule 的部分
^(.*)$ 2009/$1 [L,NE]
這將轉化/dir/css/theme.css
為/dir/2009/css/theme.css
.
然而,該規則仍然存在一個問題,因為它會導致無限嵌套,因為 (.*) 將匹配任何 URL。因此,在第一步驟中,我們的範例 URL 被重寫為/dir/2009/css/theme.css
.由於新的 URL/dir/2009/css/theme.css
也符合我們的規則,它將再次被重寫,然後一次又一次...
所以基本上我們需要一些東西來防止重寫已經被重寫的 URL。因此,如果 URL 已經包含/dir/2009
我們希望 Apache 不理會它。實現此目的的一種方法是將以下條件新增至重寫規則中
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 使用父目錄中的文件,例如 .htacess 檔案RewriteEngine off
。或者也許RewriteEngine on
沒有任何規則也可以達到目的。