htaccess Rewrite 301 帶查詢字串(參數)

來源:互聯網
上載者:User

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並不熟悉,以上有些內容自己也是從別人那裡抄來的,道理還不是很明白,也許還有錯誤。希望發現錯誤和需要改進的地方的朋友提示一下

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.