建站技術網專注分享網站建設技術,網站建設教程,真正幫你學會做網站技術,輕松解決網站建設過程中遇到的常見問題,為廣大站長服務。 網站地圖 | 收藏本站 | 訂閱
域名投資,就來找米網,認準網址:www.zhaomi.cc 專業仿站,就到仿站網:www.fangzhan.org
  站內公告: ·帝國cms教程內容已更新,歡迎關注     ·建站技術網采用阿里云服務器,備案已通    
您當前的位置:建站技術網 > 服務器教程 > windows教程

.htaccess技巧: URL重寫(Rewrite)與重定向(Redirect)

時間:2018-07-26 10:41:40  來源:網絡收集  整理: 建站技術網 www.txwlqq.com     點擊:9次

目錄 Table of Contents


一、準備開始:mod_rewrite

二、利用.htaccess實現URL重寫(rewrite)與URL重定向(redirect)

將.htm頁面映射到.php

臨時重定向(R=302)與永久重定向(R=301)

為什么要用重定向?——重定向和URL重寫的區別

長短地址轉換

去掉www

加上www

支持多域名訪問

三、改寫查詢字符串QUERY_STRING

利用QSA轉換查詢字符串QUERY_STRING

利用RewriteCond改寫查詢字符串QUERY_STRING

QSA與RewriteCond雙劍齊發

剝離查詢字符串

四、利用RewriteCond和RewriteRule進行訪問控制

文件訪問控制

用.htaccess阻止User-agent

用.htaccess阻止盜鏈(hot-linking)

References




URL重定向是.htaccess的重頭戲,它可以將長地址轉為短地址、將動態地址轉為靜態地址、重定向丟失的頁面、防止盜鏈、實現自動語言轉換等。筆者覺得難點是在正則表達式的運用和理解上。有關htaccess的正則表達式用法,請查閱本站《.htaccess正則表達式》一文。


一、準備開始:mod_rewrite


實現所有這些神奇功能的模塊叫做mod_rewrite,請確保你的服務器安裝并啟用了該模塊:


sudo a2enmod rewrite

我們一般會把所有涉及URL重寫或者重定向的代碼這樣放置:


<IfModule mod_rewrite.c>

 # Turn on rewrite engine

 Options +FollowSymlinks

 RewriteEngine on

 # More rules below

 ...

</IfModule>

一些我們需要注意的地方:


FollowSymlinks必須啟用,這是rewrite引擎的安全需求。

通常FollowSymlinks在Apache的主配置文件中就已經啟用了,所以通?梢允÷。

RewriteEngine命令用于啟用rewrite引擎

IfModule命令用于判斷Apache是否安裝了mod_rewrite模塊,之后筆者會省略該命令,但不代表這是個好習慣。

mod_rewrite會處理所有提交給Apache的URL請求,并與之后的規則進行匹配

下面我們開始講解一些例子。


二、利用.htaccess實現URL重寫(rewrite)與URL重定向(redirect)


1.將.htm頁面映射到.php

Options +FollowSymlinks

RewriteEngine on

RewriteRule ^(.*)\.htm$ $1.php [NC]

注意事項:


該RewriteRule能夠將.htm靜態頁面映射到.php動態頁面

如果通過.htm進入,瀏覽器地址欄顯示的是.htm擴展名,但服務器上實際執行的是.php

必須保證服務器上有對應的.php,否則會404

瀏覽器和搜索引擎可以同時通過.htm和.php訪問網頁

如果該目錄上存在.htm,將被忽略

[NC]表示“不區分大小寫”,更多類似定義請參考本站《.htaccess正則表達式》一文

2.臨時重定向(R=302)與永久重定向(R=301)

RewriteEngine onRewriteBase /RewriteRule ^(.*)\.htm$ $1.php [R,NC,L]

注意事項:


該RewriteRule能夠將.htm靜態頁面重定向到.php動態頁面

如果通過.htm進入,瀏覽器地址欄會自動轉為.php,這也是重定向的本質

必須保證服務器上有對應的.php,否則會404

瀏覽器和搜索引擎可以同時通過.htm和.php訪問網頁

如果該目錄上存在.htm,將被忽略

RewriteBase定義了重寫基準目錄。

例如,如果你將虛擬站點設置在/var/www目錄下,刪除這行將會導致重定向到http://yourdomain.com/var/www/1.php。顯然這是找不到的,而且你也不會希望用戶看見你的服務器的目錄結構。

再舉個例子,如果RewriteBase /base/,那么將會重定向到http://yourdomain.com/base/1.php。

對于重寫基準目錄,我們還可以通過將$1.php變成/$1.php實現直接變換,這時就可以將RewriteBase省略。

字母R表示臨時重定向,相當于[R=302,NC]。關于重定向代碼,請參考本站《HTTP協議重定向編碼》

字母L表示如果能匹配本條規則,那么本條規則是最后一條(Last),忽略之后的規則。

在討論R=302臨時重定向后,理解R=301永久重定向也就容易多了:


RewriteEngine on

RewriteRule ^(.*)$ http://newdomain.com/$1 [R=301,NC,L]

這個規則告訴瀏覽器和搜索引擎,網站地址發生了永久性變更,用戶的URL請求將會被發送給新的域名(主機)處理。

由于是重定向到新的主機地址,RewriteBase也就沒有出現的必要了。

3.為什么要用重定向?——重定向和URL重寫的區別

通過重定向,瀏覽器知道頁面位置發生變化,從而改變地址欄顯示的地址

通過重定向,搜索引擎意識到頁面被移動了,從而更新搜索引擎索引,將原來失效的鏈接從搜索結果中移除

臨時重定向(R=302)和永久重定向(R=301)都是親搜索引擎的,是SEO的重要技術

URL重寫用于將頁面映射到本站另一頁面,若重寫到另一網絡主機(域名),則按重定向處理

4.長短地址轉換

利用URL重寫,我們可以很方便地實現長短地址的轉換,但是用重定向就不合適了。


RewriteEngine On

RewriteRule ^grab /public/files/download/download.php

若訪問


http://mysite/grab?file=my.zip


則會執行該頁面:


http://mysite/public/files/download/download.php?file=my.zip


5.去掉www

Options +FollowSymlinks

RewriteEngine on

RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]

RewriteRule ^(.*)$ http://%1/$1 [R=301,NC,L]

6.加上www

RewriteEngine On

RewriteCond %{HTTP_HOST} ^(.*)$

RewriteRule (.*) http://www\.%1/$1 [R=301,L]

7.支持多域名訪問

如果你不湊巧買到了不支持多域名的主機,那么.htaccess或許可以幫助你,F在假設你有域名domain-one.com和domain-two.com,并且在服務器根目錄有對應文件夾one和two,那么通過下面的改寫就能讓Apache同時接受者兩個域名的請求:


#two domains served from one root..

RewriteCond %{HTTP_HOST} domain-one.com

RewriteCond %{REQUEST_URI} !^/one

RewriteRule ^(.*)$ /one/$1 [L]


RewriteCond %{HTTP_HOST} domain-two.com

RewriteCond %{REQUEST_URI} !^/two

RewriteRule ^(.*)$ /two/$1 [L]

三、改寫查詢字符串QUERY_STRING

查詢字符串是指URL請求中“問號”后面的部分。比如,http://mysite/grab?foo=bar中粗體部分就是查詢字符串,其中變量名是foo,值是bar。


1.利用QSA轉換查詢字符串QUERY_STRING

QSA標志( Query String Appending)用于在URI中截取查詢字符串,這個截取操作是通過小括號正則表達式實現的:


RewriteEngine On

RewriteRule /pages/(.+) /page.php?page=$1 [QSA]

將會把請求/pages/123?one=two 映射到 /page.php?page=123&one=two

注意粗體部分幾乎是相同的,除了“問號”變成了“與”符號

如果沒有QSA標志,那么會映射到/page.php?page=123。

如果沒有用到小括號正則表達式,就不需要QSA,這在上節“長短地址轉換”中已經例證過了。

小括號正則表達式可以截取查詢字符串中的內容,但是如果沒有開啟QSA標志,那么在/page.php?page=$1中“問號”之后將會被剝離丟棄。這種特性可以用于實現“剝離查詢字符串”

通過QSA,我們可以將簡單鏈接/simple/flat/link/ 映射成 server-side.php?first-var=flat&second-var=link


RewriteEngine On

RewriteRule ^/([^/]+)/([^/]+)/? /index.php?first-var=$1&second-var=$2 [QSA]

2.利用RewriteCond改寫查詢字符串QUERY_STRING

RewriteEngine On

RewriteCond %{QUERY_STRING} foo=(.*)

RewriteRule ^grab(.*) /page.php?bar=%1

該規則將訪問請求http://mysite/grab?foo=bar轉換為http://mysite/page.php?bar=bar

RewriteCond用于捕獲查詢字符串(QUERY_STRING)中變量foo的值,并存儲在%1中

QUERY_STRING是Apache定義的“變量=值”向量(數組)

3.QSA與RewriteCond雙劍齊發

RewriteEngine On

RewriteCond %{QUERY_STRING} foo=(.+)

RewriteRule ^grab/(.*) /%1/index.php?file=$1 [QSA]

會把/grab/foobar.zip?level=5&foo=bar 映射到 /bar/index.php?file=foobar.zip&level=5&foo=bar

轉換后根目錄是bar目錄

foobar.zip?level=5中的“問號”變成了foobar.zip&level=5中的“與”符號

4.剝離查詢字符串

只需在要開始剝離的鏈接后面加個“問號”,并且不要啟用QSA標志,就可剝離查詢字符串


RewriteEngine On

# Whatever QS is

RewriteCond %{QUERY_STRING} . 

# I don't want it with Question mark

RewriteRule foo.php(.*) /foo.php? [L]

四、利用RewriteCond和RewriteRule進行訪問控制


我們在第一篇.htaccess基礎中提到了很多有用的訪問控制方法,其實通過Rewrite也能實現類似的功能,而且可以更強大!


1.文件訪問控制

之前利用Order、Files及FilesMatch命令實現的訪問控制可以滿足大部分要求,但是當用戶被拒絕時,他們看到的是碩大的“403 Forbidden”,如果你不想傷害用戶的感情,就需要顯示一些別的東西,通過Rewrite就可以實現這個特性:


RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !^(.+)\.css$

RewriteCond %{REQUEST_FILENAME} !^(.+)\.js$

RewriteCond %{REQUEST_FILENAME} !special.zip$

RewriteRule ^(.+)$ /chat/ [NC]

該規則將僅允許用戶請求.css, .js類型的文件,還有special.zip文件

RewriteRule 后面指定了限制規則:映射到/char/目錄下處理

RewriteCond 后面的“感嘆號”(!)起到了“否定”作用,它表明,對不滿足后面正則表達式者應用RewriteRule規則,也就是對當前類型的文件將不應用規則

RewriteCond 之間是以邏輯“與”連接的,也就是只有當三個條件都不滿足時才執行RewriteRule

該規則也會限制訪問.htm, .jpg等格式

該規則不可以放在虛擬站點根目錄(/)下,否則會死循環

如果是二級目錄,如/test/,那么傳入RewriteCond的參數是以/test/開始的,因此從(.+)獲得的文件名也含有/test/,讀者必須對此多加小心

要想僅獲得文件名,可以將(.+)替換成([^/]+),并且去掉符號^,如下所示:

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !([^/]+)\.css$

RewriteCond %{REQUEST_FILENAME} !([^/]+)\.js$

RewriteRule ^(.+)$ /chat/ [NC]

2.用.htaccess阻止User-agent

什么是User-agent?User-agent用于瀏覽器向服務器“自報家門”,更確切的說是所有HTTP客戶端都得用User-agent向服務器“自報家門”,以便服務器對不同的客戶端作出不同響應。比如,某站點可能需要對瀏覽器、搜索引擎crawl還有各類下載工具作出不同的響應。服務器就是通過所謂的User-agent進行區分的。

如果你的服務器提供某些資源的下載,那么你就必須多加小心諸如“迅雷”等下載軟件,因為它們可能把你網站資源吸干,并且影響你的正常訪客訪問。為此,我們可以利用Rewrite限制某些UA的訪問:


RewriteEngine on

RewriteCond %{HTTP_USER_AGENT} 2.0.50727 [NC]

RewriteRule . abuse.txt [L]

該規則限制“迅雷”客戶端下載資源,并將下載文件重置到abuse.txt

HTTP_USER_AGENT是Apache的內置變量

2.0.50727是迅雷User-agent的特征字符串

RewriteRule后面的“點”表示“任意URI”,也就是不管請求的是什么,都輸出abuse.txt

通常,我們不會僅限制一個UA。利用[OR]即可實現對多個UA作出統一處理:


RewriteEngine on

RewriteCond %{HTTP_USER_AGENT} 2.0.50727 [NC,OR]

RewriteCond %{HTTP_USER_AGENT} ^BlackWidow [NC,OR]

# etc..

RewriteCond %{HTTP_USER_AGENT} ^Net\ Vampire [NC]

RewriteRule . abuse.txt [L]

3.用.htaccess阻止盜鏈(hot-linking)

盜鏈,特別是圖片,是非?蓯u的!哪怕將圖片復制到自己服務器上,也比盜用他人的圖片鏈接來得光彩。ㄍ略阃戤叄

.htaccess的Rewrite功能可以提供非常簡單、有效的方法阻止這種可恥行為:


RewriteEngine On

RewriteCond %{HTTP_REFERER} !^$

RewriteCond %{HTTP_REFERER} !^http://(www\.)?lesca\.me/ [NC]

RewriteCond %{REQUEST_URI} !hotlink\.png [NC]

RewriteRule .*\.(gif|jpg|png)$ /hotlink.png [NC]

簡單解釋一下該規則的功能:


除本站以外其他網站都不得引用本站圖片,具體可以理解為

如果引用站點為“空”或者是“本站”,或者,所引用對象是“hotlink.png”,那么就允許訪問

再次提醒,RewriteCond之間默認的邏輯連接詞是邏輯“與”

這里的難點是理解邏輯轉換,即德·摩根定律

References:


[1] more .htaccess tips and tricks..

[2] Stupid htaccess Tricks

[3] QSA Flag

[4] 5 useful url rewriting examples using .htaccess


標簽:
文章標題:.htaccess技巧: URL重寫(Rewrite)與重定向(Redirect)
文章網址:http://www.txwlqq.com/fuwuqiJiaocheng/windows/3933.html
上一篇:iptables之禁ping和ddos向外發包腳本總結
下一篇:hosts是什么 hosts文件在什么位置 如何修改hosts
來頂一下
返回首頁
返回首頁
相關文章
    無相關信息
推薦資訊
如何通過SEO優化排名賺錢?SEO賺錢方法
如何通過SEO優化排名賺
seo優化教程:網站seo內容優化
seo優化教程:網站seo
SEO細節:企業SEO如何快速為新站做出效果
SEO細節:企業SEO如何
電商技術將如何發展?2018年有這五個大膽預測
電商技術將如何發展?
最新文章
欄目更新
欄目熱門
成人黄色