htaccess Rewrite 301 帶查詢字串(參數)有需要瞭解的朋友可參考一下本文章。
整體url都發生了改變(網域名稱沒變),因為是lamp環境,所以想使用htccess來進行301重新導向.網上找了下,有大致兩種寫法:
代碼如下 |
複製代碼 |
1.#第一種 Redirect permanent a.php b.php #或 Redirect 301 a.php b.php #第二種 RewriteRule a.php b.php [L,R=301] |
rewriterule方括弧中為修飾符,詳細的flag請看這裡http://httpd.apache.org/docs/2.4/rewrite/flags.html#page-header
我的需求是把view.php?iid=123 301 到 /item/123
這種帶有查詢字元的連結怎麼重新導向呢?我嘗試了以下兩種但不可用:
代碼如下 |
複製代碼 |
1.Redirect 301 ^view.php?iid=(d+)$ /item/$1 2.RewriteRule ^view.php?iid=(d+)$ /item/$1 [L,R=301]
|
做htaccess 中 rewrite規則時,其中301跳轉,發現跳轉後的網址自動加上了參數傳遞,也就是Querystring。
如這樣的規則
代碼如下 |
複製代碼 |
RewriteRule ^brot.* http://local.abc.com [R=301,L] |
當遇到這樣的網址時,就自動帶上參數
代碼如下 |
複製代碼 |
http://local.abc.com/brot/dsf?abc=1 |
會變成這樣的網址:
代碼如下 |
複製代碼 |
http://local.abc.com/?abc=1 |
後來發現,查詢字串和檔案都是需要單獨解析的,最終的寫法為:
代碼如下 |
複製代碼 |
1.RewriteCond %{QUERY_STRING} ^iid=(d+)$ RewriteRule ^view.php$ /item/%1? [L,R=301] #如果你的apache版本>=2.4,可以使用QSD flag #RewriteRule ^view.php$ /item/%1 [L,R=301,QSD] QSD = qsdiscard 刪除查詢字串(apache 2.4以後新加) QSA = qsappend 添加查詢字串(這個比較常用) |
注意事項
1.查詢字串使用的%做反向引用,Regex的使用和rewriterule中是一樣的,%1表示除原字串外第一個匹配,即%0為iid=123,%1為123
2.第二條中/item/%1?後面我加了個問號,這是因為我的apache版本是2.2,只有在2.4中才有flag [QSD],這裡添加了個空查詢,可以獲得最終的item/123的結果.如果你沒使用QSD或者在後面加“?”你將得到的結果是/item/123?iid=123,因為301預設把查詢字元添加上了
下面是學習日記Blog全套重新導向方案。供自己備忘和需要的朋友參考。
1、根目錄“/”下:
代碼如下 |
複製代碼 |
# BEGIN WordPress
RewriteEngine On
RewriteBase / #把ab.cn的網址全部重新導向到www.ab.cn下
RewriteCond % ^ab.cn [NC] RewriteRule ^(.*)$ http://www.ab.cn/$1 [L,R=301] #除開*.do形式的URL(必須),其它是wordpress添加的用來實現動態網址偽靜態化的,具體實現原理不懂
RewriteCond % !-f RewriteCond % !-d RewriteCond % !. .do RewriteRule . /index.PHP [L] #把*.do形式的帶查詢字串的URL重新導向現在的網址
RewriteCond % dis(Goal|Diary)ContentAction.do RewriteCond % ^((([a-zA-Z] )=([0-9a-z]*)&)*)goalID=([0-9] )((&([a-zA-Z] )=([0-9a-z]*))*)$ RewriteRule ^dis(Goal|Diary)ContentAction.do$ http://www.ab.cn/archives/diaries/%5.htm? [R=301] RewriteCond % rssAction.do
RewriteCond % ^type=latestDiaries(. )$ RewriteRule ^rssAction.do$ http://www.ab.cn/feed? [R=301] RewriteCond % rssAction.do
RewriteCond % ^type=latestAdvices(. )$ RewriteRule ^rssAction.do$ http://www.ab.cn/comments/feed? [R=301] # END WordPress
|
2、在/archives/goals/目錄下,把下面的URL重新導向到/archives/diaries/下面:
代碼如下 |
複製代碼 |
# Control the page under /archives/goals/ 301 redirect to /archives/diaries/ # This .htaccess is puted into /archives/goals/ RewriteEngine On
RewriteBase / RewriteCond % !-f RewriteCond % !-d RewriteRule ^(.*)$ http://www.ab.cn/archives/diaries/$1 [R=301] # End
# 2007.07.14 10:40 |
3、在目錄/diaries/下,把/diaries/103.JSp形式的URL重新導向到/archives/diaries/103.htm
代碼如下 |
複製代碼 |
# Control the page like /diaries/103.JSp 301 redirect to /archives/diaries/103.htm # This .htaccess is puted into /diaries/ RewriteEngine On
RewriteBase / RewriteCond % !-f RewriteCond % !-d RewriteRule ^([0-9] ).JSp$ http://www.ab.cn/archives/diaries/$1.htm [R=301] # End
# 2007.07.14 11:34 |
4、在目錄/goals/下,把/goals/1.JSp形式的URL重新導向到/archives/diaries/1.htm
代碼如下 |
複製代碼 |
# Control the page like /goals/1.JSp 301 redirect to /archives/diaries/1.htm # This .htaccess is puted into /goals/ RewriteEngine On
RewriteBase / RewriteCond % !-f RewriteCond % !-d RewriteRule ^([0-9] ).JSp$ http://www.ab.cn/archives/diaries/$1.htm [R=301] # End
# 2007.07.14 11:45 |
5、放在/java目錄下,把網域名稱java.ab.cn或www.java.ab.cn下的所有網址重新導向到www.ab.cn
代碼如下 |
複製代碼 |
RewriteEngine on RewriteCond % ^java.ab.cn$ [OR] RewriteCond % ^www.java.ab.cn$ RewriteRule ^(.*)$ http://www.ab.cn/$1 [R=301,L] |
6、在目錄/sitemaps/下,把/sitemaps/goal1-1.JSp形式的網址重新導向到/archives/sitemaps/goal1-1.htm
代碼如下 |
複製代碼 |
# Control the page like /sitemaps/goal1-1.JSp 301 redirect to /archives/sitemaps/goal1-1.htm # This .htaccess is puted into /sitemaps/ RewriteEngine On
RewriteBase / RewriteCond % !-f RewriteCond % !-d RewriteRule ^(goal[0-9] -1).JSp$ http://www.ab.cn/archives/sitemaps/$1.htm [R=301] RewriteRule ^(goals-1).JSp$ http://www.ab.cn/archives/sitemaps/$1.htm [R=301] # End
# 2007.07.14 12:00
|
其中,帶查詢字串的重新導向寫法很不好找,花了我好多天時間,問了三個論壇,查了N多網頁也沒有結果。有朋友還下了一個結論:“除非用程式,否則不可能實現這個需求”。最後用“RewriteCond %”為關鍵字在google.cn上搜尋,才在Module mod_rewrite:Rewriting URLs With Query Strings和mod rewrite query string problem找到一點線索,花了一個下午來調試才成功的。得來不易啊。
我對apache的mod_rewrite並不熟悉,以上有些內容自己也是從別人那裡抄來的,道理還不是很明白,也許還有錯誤。希望發現錯誤和需要改進的地方的朋友提示一下