2011-10-25 54 views
1

我有一個完整的網站建立在查詢字符串的鏈接方案上(即?page = about或?page = individual & i = johndoe)。當然,回想起來,我們決定採用不同的(美化)方案,以便更加適合搜索引擎優化(即/ about/or/individual/johndoe /)。如何美麗的查詢字符串的網址

有沒有辦法在Apache .htaccess文件上使用mod_rewrite來完成這種改變,而不必更改站點範圍內的所有鏈接?例如,如果你點擊一個鏈接到?page =關於它會永久地將你重定向到/ about /。

我試過的代碼將成功顯示/ about/as?page = about,但是,沒有涉及重定向。說實話,我從來沒有在mod_rewrite上做過任何工作(這有點嚇人),所以我覺得我會走錯方向。儘管如此,這是迄今爲止我一直在使用的代碼:

RewriteEngine On 
RewriteRule ^([a-zA-Z0-9_]+)$ /$1/ [R] 
RewriteRule ^([a-zA-Z0-9_]+)/$ /index.php?page=$1 

RewriteRule ^([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)$ /$1/$2/ [R] 
RewriteRule ^([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)/$ /index.php?page=$1&i=$2 
RewriteRule ^([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)/$ /index.php?page=$1&id=$2 
RewriteRule ^([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)/$ /index.php?page=$1&bctid=$2 
RewriteRule ^([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)/$ /index.php?page=$1&bclid=$2 

有什麼想法?我非常感謝任何幫助。

+3

有匹配相同的模式是行不通的多個重寫規則,是與案件在你的例子中最底層的4個重寫規則,因爲只有這些規則中的第一個會被apache選中。此外,你應該使用301重定向永久重定向。 –

回答

2

首先...重寫將只適用於重寫請求。其結果是你在你的問題中列出的更改將現在允許在兩個方面要訪問的頁面:

/index.php?page=about 
/about/ 

這意味着,除非你整個網站的改變,你不能真正使很多,因爲每個人的變化指向了錯誤的URL。

我認爲,而不是你想使用mod_redirect,將用戶重定向到新的形成的URL。我想你可以將這個新的URL映射回你網站實際期望的版本。我相信這是有效的,並不會導致循環。

這就是說,我認爲有一些搜索引擎優化丁,因爲所有網頁都有重定向,而且沒有人直接指向更好的網址。這可能不會給你你想要的結果。另一種選擇是使用您提供的那些正則表達式,並實際上在所有視圖中更改真實的代碼。這可能很容易或很難,這取決於你如何製作鏈接。

祝你好運。

澄清

我讀了你的問題,你想要幾個不同的東西:

  1. 你不想改變什麼巨大的方式您的網站,但你要很好的網址(也許你正在使用一個框架的力量頁面被這樣調用)。這意味着你需要支持醜陋和漂亮的網址,這意味着你需要mod_rewrite,這樣兩個版本都能正常工作。
  2. 您的目標是爲搜索引擎製作更好的網址。這意味着你應該「鼓勵」使用醜陋URL的用戶來改用漂亮的網址。在這種情況下,你應該清理你網站上的舊網址。如果不是谷歌將繼續爬行醜陋的網址(因爲這是唯一的看到)。
  3. 你不能清理其他人的網址,所以你應該mod_redirect他們的鏈接到醜陋的網址到你的好。這樣谷歌會很好地找到好的網址。 (這是我不確定的部分。mod_redirect和mod_rewrite會導致循環嗎?我想不會,但如果是的話那麼唯一的#1和#2是可行的,而且你只需要忍受別人的網站指向你的醜網址
+0

所以基本上你說除了重寫之外還需要重定向?其次,我還應該瀏覽網站,並更改所有鏈接到新標準,因爲它們無論如何都不會真正進入正確的頁面。我是否也糾正過這個問題? – cereallarceny

0
RewriteEngine On 

RewriteRule ^([a-zA-Z0-9_]+)$ /$1/ [NC,R=301] 
RewriteRule ^([a-zA-Z0-9_]+)/$ /index.php?page=$1 

RewriteRule ^(artists)/([a-zA-Z0-9_]+)$ /artists/$2/ [NC,R=301] 
RewriteRule ^(artists)/([a-zA-Z0-9_]+)/$ /index.php?page=individual&i=$2 

RewriteRule ^(photos)/([a-zA-Z0-9_]+)$ /photos/$2/ [NC,R=301] 
RewriteRule ^(photos)/([a-zA-Z0-9_]+)/$ /index.php?page=photogallery&person=$2 

RewriteRule ^(post)/([a-zA-Z0-9_]+)$ /post/$2/ [NC,R=301] 
RewriteRule ^(post)/([a-zA-Z0-9_]+)/$ /index.php?page=post&id=$2 
RewriteRule ^(rss)/([a-zA-Z0-9_]+)$ /rss/$2/ [NC,R=301] 
RewriteRule ^(rss)/([a-zA-Z0-9_]+)/$ /index.php?page=post&rss=$2 
RewriteRule ^(search)/([a-zA-Z0-9_]+)$ /search/$2/ [NC,R=301] 
RewriteRule ^(search)/([a-zA-Z0-9_]+)/$ /index.php?page=post&q=$2 

RewriteRule ^(video)/([a-zA-Z0-9_]+)$ /video/$2/ [NC,R=301] 
RewriteRule ^(video)/([a-zA-Z0-9_]+)/$ /index.php?page=videogallery&bctid=$2 
RewriteRule ^(playlist)/([a-zA-Z0-9_]+)$ /playlist/$2/ [NC,R=301] 
RewriteRule ^(playlist)/([a-zA-Z0-9_]+)/$ /index.php?page=videogallery&bclid=$2 

這裏是我結束了使用。不知道是否所有這些標誌是必要的......但它使用以前的代碼。我仍然需要更改站點上的所有鏈接(前端和後端),但是我也應該對所有舊鏈接進行重定向,以防我錯過其他鏈接到舊頁面的鏈接。

0

我的意思是最好的辦法是如何做到這一點的是:

RewriteRule ^([a-zA-z0-9-]+)/?([a-zA-Z0-9/-]+)?$ index.php?page=$1&par=$2 

和PHP:

$page = $_GET["page"]; 
$parm = split("/",$_GET["par"]); 

// first par 
$parm[0]; 
相關問題