2011-01-31 56 views
7

我有一個網站,其中包含一組已放入CMS的舊.html和.php網頁。在.htaccess中使用mod_rewrite和mod_alias(重定向301)?

目前.htaccess文件中大約有30 mod_alias中重定向以下形式:

redirect 301 /oldpage1.html http://www.example.com/newpage1.php 
redirect 301 /oldpage2.php http://www.example.com/newpage2.php 
redirect 301 /oldpage3.php http://www.example.com/newpage3.php 

但我們要使用mod_rewrite有漂亮的網址在CMS,將採取的形式http://www.example.com/pagename.php,所以還具備以下條件:

RewriteEngine on 
RewriteBase/
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.+)$ index.php?page=$1 

在這兩個被應用起來的那一刻,這會導致:

http://www.example.com/newpage1.php?page=oldpage1.html 

如何申請只有當沒有比賽已經由mod_alias中做出重定向301條語句,這樣下發生的重寫規則:

http://www.example.com/oldpage1.html - >重定向到 - > http://www.example.com/newpage1.php - 這被視爲> - > http://www.example.com/index.php?page=/newpage1.php

任何提示將非常感激?謝謝。

回答

10

我找到了答案在great explanation of mod_rewrite and mod_alias

的問題是,mod_rewrite的總是mod_alias中之前發生,無論是放置在.htaccess的順序。這與這種情況所需的訂單相反。

訣竅是使用RewriteRule [R=301]而不是redirect 301,因此使用mod_rewrite代替它與mod_alias混合。

完整解決方案如下:

RewriteEngine on 
RewriteBase/

RewriteRule ^oldpage1.html /newpage1.php [R=301,L] 
RewriteRule ^oldpage2.php /newpage2.php [R=301,L] 
RewriteRule ^oldpage3.php /newpage3.php [R=301,L] 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.+)$ index.php?page=$1