2009-04-14 95 views
1

我將500多個頁面的大型靜態網站轉移到Joomla安裝中,但我想要做的是,而不是編寫500多行.htaccess文件,是使用PHP構建的在301頭重定向到動態重定向到新的URL的請求。301使用PHP和MySQL重定向404

因此,例如,當我移動網站,以下URL將404沒有redirect-

http://www.foo.com/old_page.html

我希望它重定向到

http://www.foo.com/old-page.php 

所以我想創建一箇舊的URL的MySQL數據庫及其相應的新URL,然後,如果服務器將返回一個404,首先檢查數據庫是否存在舊的URL,如果匹配,則發出301重定向到新的網址。對,我在這裏有意義嗎?

我該怎麼做?我可以「談論」邏輯,但不確定從何處開始或如何實現它,因爲在理解PHP的同時,我並不真正瞭解這將如何與Apache協同工作(或者即使它例如......) ?

如果你知道任何腳本已經在做這件事,那就更好了。

回答

5

在你的Apache配置中,設置你喜歡的任何/404handler.php腳本的ErrorDocument。在其運行上下文中,$ _SERVER ['REQUEST_URI']將是請求的原始頁面的URI。做數據庫查詢,如果你發現你想要重定向的頁面,可以使用標題(「Location:」。$ where where)重定向到它。

0

而不是創建一個數據庫,爲什麼不把一個重定向到舊網址(即old_page.html)的頁面?

由於您明顯是根據具體情況對數據庫條目進行此操作,因此您可以根據具體情況按照具體情況對其進行操作。

你可以寫一個快速的perl腳本或任何你喜歡的東西給你生成這些html頁面給你一箇舊頁面的名稱和新頁面的URL。

1

我能想到的最簡單的方法是使用mod_rewrite(鏈接是一個很好的入門教程)將所有傳入請求重定向到一個PHP腳本(或者使用一個標誌,以便只有在請求時纔會發生這種重定向是針對不存在的文件),請求的地址作爲查詢字符串的一部分傳遞。從那裏,讓PHP腳本查找請求應該到達的位置,然後重定向到該位置。

所以如果有人試圖打開http://www.foo.com/old_page.html,mod_rewrite會發送到類似http://www.foo.com/redirect.php?page=old_page.html的東西。 redirect.php然後執行數據庫查找以查看「old_page.html」的新地址是什麼,然後重定向到那裏。

0

你也可以使用一個RewriteMap

old_page new-page 
# … 

但你需要定義地圖在你的httpd.conf(或當前虛擬主機配置):

RewriteMap oldtonew txt:/path/to/file/map.txt 

然後,您可以使用在你的地圖上。htaccess文件:

RewriteCond ${oldtonew:$1} .+ 
RewriteRule ^(.*)\.html$ /%0.html [L,R=301]