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}一點。對於像 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沒有任何規則也可以達到目的。

相關內容