.htaccess詳解及.htaccess參數說明

原文連接:http://blog.csdn.net/weilee2009/article/details/12905081javascript

 

.htaccess文件(或者」分佈式配置文件」)提供了針對目錄改變配置的方法, 即,在一個特定的文檔目錄中放置一個包含一個或多個指令的文件, 以做用於此目錄及其全部子目錄。做爲用戶,所能使用的命令受到限制。管理員能夠經過Apache的AllowOverride指令來設置。php

概述來講,htaccess文件是Apache服務器中的一個配置文件,它負責相關目錄下的網頁配置。經過htaccess文件,能夠幫咱們實現:網頁301重定向、自定義404錯誤頁面、改變文件擴展名、容許/阻止特定的用戶或者目錄的訪問、禁止目錄列表、配置默認文檔等功能。css

.htaccess 詳解

 

來源網址: http://www.cnblogs.com/adforce/archive/2012/11/23/2784664.htmlhtml

.htaccess是什麼java

啓用.htaccess,須要修改httpd.conf,啓用AllowOverride,並能夠用AllowOverride限制特定命令的使用。若是須要使用.htaccess之外的其餘文件名,能夠用AccessFileName指令來改變。例如,須要使用.config ,則能夠在服務器配置文件中按如下方法配置:AccessFileName .config 。linux

籠統地說,.htaccess能夠幫咱們實現包括:文件夾密碼保護、用戶自動重定向、自定義錯誤頁面、改變你的文件擴展名、封禁特定IP地址的用戶、只容許特定IP地址的用戶、禁止目錄列表,以及使用其餘文件做爲index文件等一些功能。web

工做原理正則表達式

.htaccess文件(或者」分佈式配置文件」)提供了針對每一個目錄改變配置的方法,即在一個特定的目錄中放置一個包含指令的文件,其中的指令做用於此目錄及其全部子目錄。
說明:
若是須要使用.htaccess之外的其餘文件名,能夠用AccessFileName指令來改變。例如,須要使用.config ,則能夠在服務器配置文件中按如下方法配置:
AccessFileName .config
一般,.htaccess文件使用的配置語法和主配置文件同樣。AllowOverride指令按類別決定了.htaccess文件中哪些指令纔是有效的。若是一個指令容許在.htaccess中使用,那麼在本手冊的說明中,此指令會有一個覆蓋項段,其中說明了爲使此指令生效而必須在AllowOverride指令中設置的值。apache

(不)使用.htaccess文件的場合ubuntu

通常狀況下,不該該使用.htaccess文件,除非你對主配置文件沒有訪問權限。有一種很常見的誤解,認爲用戶認證只能經過.htaccess文件實現,其實並非這樣,把用戶認證寫在主配置文件中是徹底可行的,並且是一種很好的方法。
.htaccess文件應該被用在內容提供者須要針對特定目錄改變服務器的配置而又沒有root權限的狀況下。若是服務器管理員不肯意頻繁修改配置,則能夠容許用戶經過.htaccess文件本身修改配置,尤爲是ISP在同一個機器上運行了多個用戶站點,而又但願用戶能夠本身改變配置的狀況下。
雖然如此,通常都應該儘量地避免使用.htaccess文件。任何但願放在.htaccess文件中的配置,均可以放在主配置文件的<Directory>段中,並且更高效。
避免使用.htaccess文件有兩個主要緣由。
首先是性能。若是AllowOverride啓用了.htaccess文件,則Apache須要在每一個目錄中查找.htaccess文件,所以,不管是否真正用到,啓用.htaccess都會致使性能的降低。另外,對每個請求,都須要讀取一次.htaccess文件。
還有,Apache必須在全部上級的目錄中查找.htaccess文件,以使全部有效的指令都起做用(參見指令的生效),因此,若是請求/www/htdocs/example中的頁面,Apache必須查找如下文件:
/.htaccess /www/.htaccess /www/htdocs/.htaccess /www/htdocs/example/.htaccess
總共要訪問4個額外的文件,即便這些文件都不存在。(注意,這可能僅僅因爲容許根目錄」/」使用.htaccess ,雖然這種狀況並很少。)

其次是安全。這樣會容許用戶本身修改服務器的配置,這可能會致使某些意想不到的修改,因此請認真考慮是否應當給予用戶這樣的特權。可是,若是給予用戶較少的特權而不能知足其須要,則會帶來額外的技術支持請求,因此,必須明確地告訴用戶已經給予他們的權限,說明AllowOverride設置的值,並引導他們參閱相應的說明,以避免往後生出許多麻煩。
注意,在/www/htdocs/example目錄下的.htaccess文件中放置指令,與在主配置文件中<Directory /www/htdocs/example>段中放置相同指令,是徹底等效的。

/www/htdocs/example目錄下的.htaccess文件的內容:
AddType text/example .exm
httpd.conf文件中摘錄的內容:
<Directory /www/htdocs/example>
AddType text/example .exm
</Directory>
可是,把配置放在主配置文件中更加高效,由於只須要在Apache啓動時讀取一次,而不是在每次文件被請求時都讀取。
將AllowOverride設置爲none能夠徹底禁止使用.htaccess文件:
AllowOverride None

指令的做用範圍

.htaccess文件中的配置指令做用於.htaccess文件所在的目錄及其全部子目錄,可是很重要的、須要注意的是,其上級目錄也可能會有.htaccess文件,而指令是按查找順序依次生效的,因此一個特定目錄下的.htaccess文件中的指令可能會覆蓋其上級目錄中的.htaccess文件中的指令,即子目錄中的指令會覆蓋父目錄或者主配置文件中的指令。

疑難解答

若是在.htaccess文件中的某些指令不起做用,可能有多種緣由。
最多見的緣由是AllowOverride指令沒有被正確設置,必須確保沒有對此文件區域設置 AllowOverride None 。有一個很好的測試方法,就是在.htaccess文件隨便增長點無心義的垃圾內容,若是服務器沒有返回了一個錯誤消息,那麼幾乎能夠判定設置了 AllowOverride None 。
在訪問文檔時,若是收到服務器的出錯消息,應該檢查Apache的錯誤日誌,能夠知道.htaccess文件中哪些指令是不容許使用的,也可能會發現須要糾正的語法錯誤。

.htaccess工具

不會寫的朋友,在這介紹一款很不錯.htaccess的重定向—URL重寫工具rewriting-tool

——————————————————————————–

htaccess語法教程

RewriteEngine On
RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$
RewriteCond %{REQUEST_URI} !^/blog/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /blog/$1

# 沒有輸入文件名的默認到到首頁
RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$
RewriteRule ^(/)?$ blog/index.php [L]

下面我開始解說一下上面的意思:

RewriteEngine On】

表示重寫引擎開,關閉off,做用就是方便的開啓或關閉如下的語句,這樣就不須要一條一條的註釋語句了。

RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$】

這是重寫條件,前面%{HTTP_HOST}表示當前訪問的網址,只是指前綴部分,格式是www.xxx.com不包括「http://」和「/」,^表示 字符串開始,$表示字符串結尾,\.表示轉義的. ,若是不轉義也行,推薦轉義,防止有些服務器不支持,?表示前面括號www\.出現0次或1次,這句規則的意思就是若是訪問的網址是xxx.com或者 www.xxx.com就執行如下的語句,不符合就跳過。

RewriteCond %{REQUEST_URI} !^/blog/】

也是重寫條件,%{REQUEST_URI}表示訪問的相對地址,就是相對根目錄的地址,就是域名/後面的成分,格式上包括最前面的「/」,!表示非,這句語句表示訪問的地址不以/blog/開頭,只是開頭^,沒有結尾$

RewriteCond %{REQUEST_FILENAME} !-f】

RewriteCond %{REQUEST_FILENAME} !-d】

這兩句語句的意思是請求的文件或路徑是不存在的,若是文件或路徑存在將返回已經存在的文件或路徑

RewriteRule ^(.*)$ /blog/$1】

重寫規則,最重要的部分,意思是當上面的RewriteCond條件都知足的時候,將會執行此重寫規則,^(.*)$是一個正則表達的 匹配,匹配的是當前請求的URL,^(.*)$意思是匹配當前URL任意字符,.表示任意單個字符,*表示匹配0次或N次(N>0),後面 /blog/$1是重寫成分,意思是將前面匹配的字符重寫成/blog/$1,這個$1表示反向匹配,引用的是前面第一個圓括號的成分,即^(.*)$中 的.* ,其實這兒將會出現一個問題,後面討論。

【RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$】

RewriteRule ^(/)?$ blog/index.PHP [L]】

這兩句的意思是指請求的host地址是www.xxx.com是,若是地址的結尾只有0個或者1個「/」時,將會重寫到子目錄下的主頁,我猜測這主要由於重寫後的地址是不能自動尋找主頁的,須要本身指定。

如今說說出現的問題,RewriteRule ^(.*)$ /blog/$1 前部分 ^(.*)$ 將會匹配當前請求的url。

例如:請求網址是http://www.xxx.com/a.html,究竟是匹配整個http://www.xxx.com/a.html,仍是隻匹配/a.html即反斜槓後面的成分,仍是隻匹配a.html。

答案是:根據RewriteBase規則規定,若是rewritebase 爲/,將會匹配a.html,不帶前面的反斜槓,因此上條語句應該寫成RewriteRule ^(.*)$ blog/$1(不帶/),不過實際應用上帶上前面的反斜槓,也能夠用,可能帶不帶都行。如今問題出來了,若是不設置rewritebase 爲/ ,將會匹配整個網址http://www.xxx.com/a.html,顯然這是錯誤的,因此應該添加這條:RewiteBase /

還有一個問題是,不能保證每一個人輸入的網址都是小寫的,若是輸入大寫的呢,Linux系統是區分大小寫的,因此應該在RewriteCond後添加[NC]忽略大小寫的。

至此,完整的語句應該是:

RewriteEngine On
RewiteBase /
RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$ [NC]
RewriteCond %{REQUEST_URI} !^/blog/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ blog/$1

# 沒有輸入文件名的默認到到首頁
RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$ [NC]
RewriteRule ^(/)?$ blog/index.php [L]

若是後面還繼續有語句的,就不該該加上最後的[L],由於這是表示最後一條語句的意思。

防盜鏈的語句,一樣須要添加RewiteBase /,以下:

RewriteEngine on
RewiteBase /
RewriteCond %{HTTP_REFERER} !^$ [NC]
RewriteCond %{HTTP_REFERER} !xxx.info [NC]
RewriteRule \.(jpg|gif|png|bmp|swf|jpeg)$ /error/daolian.gif [R,NC,L]

若是後面還繼續有語句的,就不該該加上最後的[L],/error/daolian.gif爲別人盜鏈時顯示的圖片。

下面附上簡單的語法規則和flags

【RewriteCond語法】

RewriteCond TestString CondPattern [flags]

rewritecond的其餘用法:

「-d」(目錄)

將TestString視爲一個路徑名並測試它是否爲一個存在的目錄。

「-f」(常規文件)

將TestString視爲一個路徑名並測試它是否爲一個存在的常規文件。

「-s」(非空的常規文件)

將TestString視爲一個路徑名並測試它是否爲一個存在的、尺寸大於0的常規文件。

「-l」(符號鏈接)

將TestString視爲一個路徑名並測試它是否爲一個存在的符號鏈接。

「-x」(可執行)

將TestString視爲一個路徑名並測試它是否爲一個存在的、具備可執行權限的文件。該權限由操做系統檢測。

「-F」(對子請求存在的文件)

檢查TestString是否爲一個有效的文件,並且能夠在服務器當前的訪問控制配置下被訪問。它使用一個內部子請求來作檢查,因爲會下降服務器的性能,因此請謹慎使用!

「-U」(對子請求存在的URL)

檢查TestString是否爲一個有效的URL,並且能夠在服務器當前的訪問控制配置下被訪問。它使用一個內部子請求來作檢查,因爲會下降服務器的性能,因此請謹慎使用!

【RewriteRule語法:】

RewriteRule Pattern Substitution [flags]

【flags】

「chain|C」(連接下一規則)

此標記使當前規則與下一個規則相連接。它產生這樣的效果:若是一個規則被匹配,則繼續處理其後繼規則,也就是這個標記不起做用;若是該規則不被匹配,則其後繼規則將被跳過。好比,在一個目錄級規則中執行一個外部重定向時,你可能須要刪除」.www」(此處不該該出現」.www」)。

「cookie|CO=NAME:VAL:domain[:lifetime[:path]]」(設置cookie)

在客戶端設置一個cookie。cookie的名稱是NAME,值是VAL。domain是該cookie的域,好比」.apache.org」,可選的lifetime是cookie的有效期(分鐘),可選的path是cookie的路徑。

「env|E=VAR:VAL」(設置環境變量)

此標記將環境變量VAR的值爲VAL,VAL能夠包含可擴展的正則表達式反向引用($N和%N)。此標記能夠屢次使用以設置多個變量。這些變量能夠在其後許多狀況下被間接引用,一般是在XSSI(<!–#echo var=」VAR」–>)或CGI($ENV{「VAR」})中,也能夠在後繼的RewriteCond指令的CondPattern參數中經過%{ENV:VAR}引用。使用它能夠記住從URL中剝離的信息。

「forbidden|F」(強制禁止URL)

強制禁止當前URL,也就是當即反饋一個HTTP響應碼403(被禁止的)。使用這個標記,能夠連接若干個RewriteConds來有條件地阻塞某些URL。

「gone|G」(強制廢棄URL)

強制當前URL爲已廢棄,也就是當即反饋一個HTTP響應碼410(已廢棄的)。使用這個標記,能夠標明頁面已經被廢棄而不存在了。

「handler|H=Content-handler」(強制指定內容處理器)

強自制定目標文件的內容處理器爲Content-handler。例如,用來模擬mod_alias模塊的ScriptAlias指令,以強制映射文件夾內的全部文件都由」cgi-script」處理器處理。

「last|L」(結尾規則)

當即中止重寫操做,並再也不應用其餘重寫規則。它對應於Perl中的last命令或C語言中的break命令。這個標記用於阻止當前已被重寫的URL被後繼規則再次重寫。例如,使用它能夠重寫根路徑的URL(「/」)爲實際存在的URL(好比:」/e/www/」)。

「next|N」(從頭再來)

從新執行重寫操做(從第一個規則從新開始)。此時再次進行處理的URL已經不是原始的URL了,而是經最後一個重寫規則處理過的URL。它對應於Perl中的next命令或C語言中的continue命令。此標記能夠從新開始重寫操做(當即回到循環的開頭)。可是要當心,不要製造死循環!

「nocase|NC」(忽略大小寫)

它使Pattern忽略大小寫,也就是在Pattern與當前URL匹配時,」A-Z」和」a-z」沒有區別。

「noescape|NE」(在輸出中不對URI進行轉義)

此標記阻止mod_rewrite對重寫結果應用常規的URI轉義規則。 通常狀況下,特殊字符(「%」, 「$」, 「;」等)會被轉義爲等值的十六進制編碼(「%25′, 「%24′, 「%3B」等)。此標記能夠阻止這樣的轉義,以容許百分號等符號出如今輸出中,好比:

RewriteRule /foo/(.*) /bar?arg=P1\%3d$1 [R,NE]

可使」/foo/zed轉向到一個安全的請求」/bar?arg=P1=zed」。

「nosubreq|NS」(不對內部子請求進行處理)

在當前請求是一個內部子請求時,此標記強制重寫引擎跳過該重寫規則。好比,在mod_include試圖搜索目錄默認文件(index.xxx)時,Apache會在內部產生子請求。對於子請求,重寫規則不必定有用,並且若是整個規則集都起做用,它甚至可能會引起錯誤。因此,能夠用這個標記來排除某些規則。

使用原則:若是你爲URL添加了CGI腳本前綴,以強制它們由CGI腳本處理,但對子請求處理的出錯率(或者資源開銷)很高,在這種狀況下,可使用這個標記。

「proxy|P」(強制爲代理)

此標記使替換成分被內部地強制做爲代理請求發送,並當即中斷重寫處理,而後把處理移交給mod_proxy模塊。你必須確保此替換串是一個可以被mod_proxy處理的有效URI(好比以http://hostname開頭),不然將獲得一個代理模塊返回的錯誤。使用這個標記,能夠把某些遠程成分映射到本地服務器域名空間,從而加強了ProxyPass指令的功能。

注意:要使用這個功能,必須已經啓用了mod_proxy模塊。

「passthrough|PT」(移交給下一個處理器)

此標記強制重寫引擎將內部request_rec結構中的uri字段設置爲filename字段的值,這個小小的修改使得RewriteRule指令的輸出可以被(從URI轉換到文件名的)Alias, ScriptAlias, Redirect等指令進行後續處理[原文:This flag is just a hack to enable post-processing of the output of RewriteRule directives, using Alias, ScriptAlias, Redirect, and other directives from various URI-to-filename translators.]。舉一個能說明其含義的例子: 若是要將/abc重寫爲/def, 而後再使用mod_alias將/def轉換爲/ghi,能夠這樣:

RewriteRule ^/abc(.*) /def$1 [PT]

Alias /def /ghi

若是省略了PT標記,雖然將uri=/abc/…重寫爲filename=/def/…的部分運做正常,可是後續的mod_alias在試圖將URI轉換到文件名時會遭遇失效。

注意:若是須要混合使用多個將URI轉換到文件名的模塊時,就必須使用這個標記。。此處混合使用mod_alias和mod_rewrite就是個典型的例子。

「qsappend|QSA」(追加查詢字符串)

此標記強制重寫引擎在已有的替換字符串中追加一個查詢字符串,而不是簡單的替換。若是須要經過重寫規則在請求串中增長信息,就可使用這個標記。

「redirect|R [=code]「(強制重定向)

若Substitution以http://thishost[:thisport]/(使新的URL成爲一個URI)開頭,能夠強制性執行一個外部重定向。若是沒有指定code,則產生一個HTTP響應碼302(臨時性移動)。若是須要使用在300-400範圍內的其餘響應代碼,只需在此指定便可(或使用下列符號名稱之一:temp(默認), permanent, seeother)。使用它能夠把規範化的URL反饋給客戶端,如將」/~」重寫爲」/u/」,或始終對/u/user加上斜槓,等等。

注意:在使用這個標記時,必須確保該替換字段是一個有效的URL。不然,它會指向一個無效的位置!而且要記住,此標記自己只是對URL加上http://thishost[:thisport]/前綴,重寫操做仍然會繼續進行。一般,你還會但願中止重寫操做而當即重定向,那麼就還須要使用」L’標記。

「skip|S=num」(跳事後繼規則)

此標記強制重寫引擎跳過當前匹配規則以後的num個規則。它能夠模擬if-then-else結構:最後一個規則是then從句,而被跳過的skip=N個規則是else從句。注意:它和」chain|C」標記是不一樣的!

「type|T=MIME-type」(強制MIME類型)

強制目標文件的MIME類型爲MIME-type,能夠用來基於某些特定條件強制設置內容類型。好比,下面的指令可讓.php文件在以.phps擴展名調用的狀況下由mod_php按照PHP源代碼的MIME類型(application/x-httpd-php-source)顯示:

RewriteRule ^(.+\.php)s$ $1 [T=application/x-httpd-php-source]

.htaccess實例

http://cloudbbs.org/forum.php?mod=viewthread&tid=7455&page=1&extra=#pid41053

http://www.chinaz.com/web/2010/0415/111514.shtml

參考:http://baike.baidu.com/view/91163.htm

http://hi.baidu.com/wojiubaibudu/item/4b3513c74a8fe47aced4f817

.htaccess rewrite 規則詳細說明

 

來源網址: http://www.cnphp.info/htaccess-rewrite.html

做者: freemouse 日期 2010年07月22日 | 能夠轉載, 但必須以超連接形式標明文章原始出處和做者信息及版權聲明

網址: http://www.cnphp.info/htaccess-rewrite.html

用Apache虛擬主機的朋友不少,apache提供的.htaccess模塊能夠爲每一個虛擬主機設定rewrite規則,這對網站SEO優化至關有用,同時也改善了用戶體驗。國內的虛擬機通常不提供.htaccess功能(據我所知,discuz的主機好像提供此功能),而在國外主機中,.htaccess功能彷佛是標配,筆者的Blog架在MT上,支持.htaccess,每次看到一堆別人寫好了的.htaccess設置,不少命令都不甚了了,查看、修改起來很不方便,痛定思痛,潛心學習一下,知其因此然嘛~

學習前提:(不會的朋友要學習一下,才能更好的理解下面的文字呢)

  • Linux基礎(不會也沒事啦,寫個.htaccess不必大費周折啦,推薦:鳥哥私房菜linux基礎)
  • 正則表達式(Rewrite規則創建在正則的基礎之上,推薦:正則表達式30分鐘入門教程)

rewrite的語法格式:

  1. RewriteEngine On #要想rewrite起做用,必需要寫上哦
  2. RewriteBase url-path #設定基準目錄,例如但願對根目錄下的文件rewrtie,就是」/」
  3. RewriteCond test-string condPattern #寫在RewriteRule以前,能夠有一或N條,用於測試rewrite的匹配條件,具體怎麼寫,後面會詳細說到。
  4. RewriteRule Pattern Substitution #規則

RewriteEngine On|Off

RewriteEngine 用於開啓或停用rewrite功能。

rewrite configurations 不會自動繼承,所以你得給每一個你想用 rewrite功能的虛擬主機目錄中加上這個指令。

RewriteBase URL-path

RewriteBase用於設定重寫的基準URL。在下文中,你能夠看見RewriteRule能夠用於目錄級的配置文件中 (.htaccess)並在局部範圍內起做用,即規則實際處理的只是剝離了本地路徑前綴的一部分。處理結束後,這個路徑會被自動地附着回去。默認值 是」RewriteBase physical-directory-path」。

在對一個新的URL進行替換時,此模塊必須把這個URL從新注入到服務器處理中。爲此,它必須知道其對應的URL前綴或者說URL基準。一般,此前綴就是 對應的文件路徑。可是,大多數網站URL不是直接對應於其物理文件路徑的,於是通常不能作這樣的假定! 因此在這種狀況下,就必須用RewriteBase指令來指定正確的URL前綴。

若是你的網站服務器URL不是與物理文件路徑直接對應的,而又須要使用RewriteBase指令,則必須在每一個對應的.htaccess文件中指定 RewriteRule 。

RewriteCond TestString CondPattern [flags]

RewriteCond指令定義了一個規則的條件,即,在一個RewriteRule指令以前有一個或多個RewriteCond指令。 條件以後的重寫規則僅在當前URI與pattern匹配而且符合這些條件的時候纔會起做用。

TestString是一個純文本的字符串,可是還能夠包含下列可擴展的成分:

  1. RewriteRule反向引用: 引用方法是 $N  (0 <= N <= 9) 引用當前(帶有若干RewriteCond指令的)RewriteRule中的 與pattern匹配的分組成分(圓括號!)。
  2. RewriteCond反向引用: 引用方法是 %N  (1 <= N <= 9) 引用當前若干RewriteCond條件中最後符合的條件中的分組成分(圓括號!)。
  3. RewriteMap 擴展: 引用方法是 ${mapname:key|default}
  4. 服務器變量: 引用方法是 %{ NAME_OF_VARIABLE }  這個是咱們最常使用到的功能

NAME_OF_VARIABLE具體數值見下表:

HTTP headers:

connection & request:

HTTP_USER_AGENT

HTTP_REFERER

HTTP_COOKIE

HTTP_FORWARDED

HTTP_HOST

HTTP_PROXY_CONNECTION

HTTP_ACCEPT

REMOTE_ADDR

REMOTE_HOST

REMOTE_USER

REMOTE_IDENT

REQUEST_METHOD

SCRIPT_FILENAME

PATH_INFO

QUERY_STRING

AUTH_TYPE

server internals:

system stuff:

specials:

DOCUMENT_ROOT

SERVER_ADMIN

SERVER_NAME

SERVER_ADDR

SERVER_PORT

SERVER_PROTOCOL

SERVER_SOFTWARE

TIME_YEAR

TIME_MON

TIME_DAY

TIME_HOUR

TIME_MIN

TIME_SEC

TIME_WDAY

TIME

API_VERSION

THE_REQUEST

REQUEST_URI

REQUEST_FILENAME

IS_SUBREQ

這些都對應於相似命名的HTTP MIME頭、Apache服務器的C變量以及Unix系統中的 struct tm字段,大多數都在其餘的手冊或者CGI規範中有所講述。 而其中爲mod_rewrite所特有的變量有:

IS_SUBREQ

若是正在處理的請求是一個子請求,它包含字符串」true」,不然就是」false」。 模塊爲了解析URI中的附加文件,有可能會產生子請求。

API_VERSION

這是正在使用的httpd中(服務器和模塊之間內部接口)的Apache模塊API的版本, 其定義位於include/ap_mmn.h中。此模塊版本對應於正在使用的Apache的版本 (好比,在Apache 1.3.14的發行版中,這個值是19990320:10)。 一般,對它感興趣的是模塊的做者。

THE_REQUEST

這是由瀏覽器發送給服務器的完整的HTTP請求行。(好比, 「GET /index.html HTTP/1.1″). 它不包含任何瀏覽器發送的附加頭信息。

REQUEST_URI

這是在HTTP請求行中所請求的資源。(好比上述例子中的」/index.html」.)

REQUEST_FILENAME

這是與請求相匹配的完整的本地文件系統的文件路徑名或描述.

CondPattern是條件pattern, 即, 一個應用於當前實例TestString的正則表達式, 即, TestString將會被計算而後與CondPattern匹配.

注意:CondPattern是一個兼容perl的正則表達式, 可是還有若干補充:

  1. 能夠在pattern串中使用’
    1
    !

    ‘ 字符(驚歎號)來實現匹配的反轉。

RewriteOptions Options

1
RewriteOptions

指令爲當前服務器級和目錄級的配置設置一些選項。 Option能夠是下列值之一:

1
inherit

此值強制當前配置能夠繼承其父配置。 在虛擬主機級配置中,它意味着主服務器的映射表、條件和規則能夠被繼承。 在目錄級配置中,它意味着其父目錄的

1
.htaccess

中的條件和規則能夠被繼承。

1
MaxRedirects=<var>number</var>

爲了不目錄級

1
RewriteRule

的無休止的內部重定向, 在此類重定向和500內部服務器錯誤次數達到一個最大值的時候,

1
mod_rewrite

會中止對此請求的處理。 若是你確實須要對每一個請求容許大於10次的內部重定向,能夠增大這個值。

RewriteRule Pattern Substitution [flags]

1
RewriteRule

指令是重寫引擎的根本。此指令能夠屢次使用。 每一個指令定義一個簡單的重寫規則。這些規則的定義順序尤其重要, 由於,在運行時刻,規則是按這個順序逐一輩子效的.

Pattern是一個做用於當前URL的兼容perl的正則表達式。

此外,還可使用否字符(‘

1
!

‘)的pattern前綴,以實現pattern的反轉。可是,須要注意的是使用否字符以反轉pattern時,pattern中不能使用分組的通配成分;即$N。

重寫規則中的Substitution是, 當原始URL與Pattern相匹配時,用以替代(或替換)的字符串。除了純文本,還可使用

  • 1
    $N

    反向引用RewriteRule的pattern

  • 1
    %N

    反向引用最後匹配的RewriteCond pattern

  • 規則條件測試字符串中(
    1
    %{VARNAME}

    )的服務器變量

  • 映射函數調用(
    1
    ${mapname:key|default})
下面給出幾個完整的例子供各位參考:

1、防盜鏈功能

只這四行就實現了防盜鏈是否是很神奇^_^,編寫起來是否是又以爲複雜。

 

RewriteEngine On

RewriteCond %{HTTP_REFERER} !^http://(.+.)?mysite.com/ [NC]

RewriteCond %{HTTP_REFERER} !^$

RewriteRule .*.(jpe?g|gif|bmp|png)$ /images/nohotlink.jpg [L]

2、網址規範化

這個是把全部二級域名都重定向到www.yourdomain.com的例子,如今看來是否是很簡單了?

Options +FollowSymLinks

rewriteEngine on

rewriteCond %{http_host} ^yourdomain.com [NC]

rewriteRule ^(.*)$ http://www.yourdomain.com/$1 [R=301,L]

3、臨時錯誤頁面

當你的網站在升級、修改的時候,你最好讓訪客轉到指定的頁面,而不是沒作完的頁面或者是錯誤頁。

RewriteEngine on

RewriteCond %{REQUEST_URI} !/maintenance.html$

RewriteCond %{REMOTE_ADDR} !^123.123.123.123

RewriteRule $ /error.html [R=302,L]

4、重定向RSS地址到FeedSky

除了能夠更改模板裏的RSS地址外,.htaccess也能實現RSS地址的更改,並更加方便。

RewriteEngine on

RewriteCond %{HTTP_USER_AGENT} !FeedSky [NC]

RewriteCond %{HTTP_USER_AGENT} !FeedValidator [NC]

RewriteRule ^feed/?([_0-9a-z-]+)?/?$ http://feed.feedsky.com/yours

=========================================================================================

附錄:flags

  1. ‘redirect|R [=code]‘ (強制重定向 redirect)

    以http://thishost[:thisport]/(使新的URL成爲一個URI) 爲前綴的Substitution能夠強制性執行一個外部重定向。 若是code沒有指定,則產生一個HTTP響應代碼302(臨時性移動)。 若是須要使用在300-400範圍內的其餘響應代碼,只需在此指定這個數值便可, 另外,還可使用下列符號名稱之一: temp (默認的), permanent, seeother. 用它能夠把規範化的URL反饋給客戶端,如, 重寫「/~」爲 「/u/」,或對/u/user加上斜槓,等等。 注意: 在使用這個標記時,必須確保該替換字段是一個有效的URL! 不然,它會指向一個無效的位置! 而且要記住,此標記自己只是對URL加上 http://thishost[:thisport]/的前綴,重寫操做仍然會繼續。 一般,你會但願中止重寫操做而當即重定向,則還須要使用’L’標記.

  2. ‘forbidden|F’ (強制URL爲被禁止的 forbidden)

    強制當前URL爲被禁止的,即,當即反饋一個HTTP響應代碼403(被禁止的)。 使用這個標記,能夠連接若干RewriteConds以有條件地阻塞某些URL。

  3. ‘gone|G’ (強制URL爲已廢棄的 gone)

    強制當前URL爲已廢棄的,即,當即反饋一個HTTP響應代碼410(已廢棄的)。 使用這個標記,能夠標明頁面已經被廢棄而不存在了.

  4. ‘proxy|P’ (強制爲代理 proxy)

    此標記使替換成分被內部地強制爲代理請求,並當即(即, 重寫規則處理當即中斷)把處理移交給代理模塊。 你必須確保此替換串是一個有效的(好比常見的以 http://hostname開頭的)可以爲Apache代理模塊所處理的URI。 使用這個標記,能夠把某些遠程成分映射到本地服務器名稱空間, 從而加強了ProxyPass指令的功能。 注意: 要使用這個功能,代理模塊必須編譯在Apache服務器中。 若是你不能肯定,能夠檢查「httpd -l」的輸出中是否有mod_proxy.c。 若是有,則mod_rewrite可使用這個功能; 若是沒有,則必須啓用mod_proxy並從新編譯「httpd」程序。

  5. ‘last|L’ (最後一個規則 last)

    當即中止重寫操做,並再也不應用其餘重寫規則。 它對應於Perl中的last命令或C語言中的break命令。 這個標記能夠阻止當前已被重寫的URL爲其後繼的規則所重寫。 舉例,使用它能夠重寫根路徑的URL(‘/’)爲實際存在的URL, 好比, ‘/e/www/’.

  6. ‘next|N’ (從新執行 next round)

    從新執行重寫操做(從第一個規則從新開始). 這時再次進行處理的URL已經不是原始的URL了,而是經最後一個重寫規則處理的URL。 它對應於Perl中的next命令或C語言中的continue命令。 此標記能夠從新開始重寫操做,即, 當即回到循環的頭部。 可是要當心,不要製造死循環!

  7. ‘chain|C’ (與下一個規則相連接 chained)

    此標記使當前規則與下一個(其自己又能夠與其後繼規則相連接的, 並能夠如此反覆的)規則相連接。 它產生這樣一個效果: 若是一個規則被匹配,一般會繼續處理其後繼規則, 即,這個標記不起做用;若是規則不能被匹配, 則其後繼的連接的規則會被忽略。好比,在執行一個外部重定向時, 對一個目錄級規則集,你可能須要刪除「.www」 (此處不該該出現「.www」的)。

  8. ‘type|T=MIME-type’ (強制MIME類型 type)

    強制目標文件的MIME類型爲MIME-type。 好比,它能夠用於模擬mod_alias中的ScriptAlias指令, 之內部地強制被映射目錄中的全部文件的MIME類型爲「application/x-httpd-cgi」.

  9. ‘nosubreq|NS’ (僅用於不對內部子請求進行處理 no internal sub-request)

    在當前請求是一個內部子請求時,此標記強制重寫引擎跳過該重寫規則。 好比,在mod_include試圖搜索可能的目錄默認文件(index.xxx)時, Apache會內部地產生子請求。對子請求,它不必定有用的,並且若是整個規則集都起做用, 它甚至可能會引起錯誤。因此,能夠用這個標記來排除某些規則。 根據你的須要遵循如下原則: 若是你使用了有CGI腳本的URL前綴,以強制它們由CGI腳本處理, 而對子請求處理的出錯率(或者開銷)很高,在這種狀況下,可使用這個標記。

  10. ‘nocase|NC’ (忽略大小寫 no case)

    它使Pattern忽略大小寫,即, 在Pattern與當前URL匹配時,’A-Z’ 和’a-z’沒有區別。

  11. ‘qsappend|QSA’ (追加請求串 query string append)

    此標記強制重寫引擎在已有的替換串中追加一個請求串,而不是簡單的替換。 若是須要經過重寫規則在請求串中增長信息,就可使用這個標記。

  12. ‘noescape|NE’ (在輸出中不對URI做轉義 no URI escaping)

    此標記阻止mod_rewrite對重寫結果應用常規的URI轉義規則。 通常狀況下,特殊字符(如’%’, ‘$’, ‘;’等)會被轉義爲等值的十六進制編碼。 此標記能夠阻止這樣的轉義,以容許百分號等符號出如今輸出中,如: RewriteRule /foo/(.*) /bar?arg=P1\%3d$1 [R,NE]

    可使’/foo/zed’轉向到一個安全的請求’/bar?arg=P1=zed’.

  13. ‘passthrough|PT’ (移交給下一個處理器 pass through)

    此標記強制重寫引擎將內部結構request_rec中的uri字段設置爲 filename字段的值,它只是一個小修改,使之能對來自其餘URI到文件名翻譯器的 Alias,ScriptAlias, Redirect 等指令的輸出進行後續處理。舉一個能說明其含義的例子: 若是要經過mod_rewrite的重寫引擎重寫/abc爲/def, 而後經過mod_alias使/def轉變爲/ghi,能夠這樣: RewriteRule ^/abc(.*) /def$1 [PT]

    Alias /def /ghi

    若是省略了PT標記,雖然mod_rewrite運做正常, 即, 做爲一個使用API的URI到文件名翻譯器, 它能夠重寫uri=/abc/…爲filename=/def/…, 可是,後續的mod_alias在試圖做URI到文件名的翻譯時,則會失效。

    注意: 若是須要混合使用不一樣的包含URI到文件名翻譯器的模塊時, 就必須使用這個標記。混合使用mod_alias和mod_rewrite就是個典型的例子。

    For Apache hackers

    若是當前Apache API除了URI到文件名hook以外,還有一個文件名到文件名的hook, 就不須要這個標記了! 可是,若是沒有這樣一個hook,則此標記是惟一的解決方案。 Apache Group討論過這個問題,並在Apache 2.0 版本中會增長這樣一個hook。

  14. ’skip|S=num’ (跳事後繼的規則 skip)

    此標記強制重寫引擎跳過當前匹配規則後繼的num個規則。 它能夠實現一個僞if-then-else的構造: 最後一個規則是then從句,而被跳過的skip=N個規則是else從句. (它和’chain|C’標記是不一樣的!)

  15. ‘env|E=VAR:VAL’ (設置環境變量 environment variable)

    此標記使環境變量VAR的值爲VAL, VAL能夠包含可擴展的反向引用的正則表達式$N和%N。 此標記能夠屢次使用以設置多個變量。 這些變量能夠在其後許多狀況下被間接引用,但一般是在XSSI (via or CGI (如 $ENV{‘VAR’})中, 也能夠在後繼的RewriteCond指令的pattern中經過%{ENV:VAR}做引用。 使用它能夠從URL中剝離並記住一些信息。

  16. ‘cookie|CO=NAME:VAL:domain[:lifetime[:path]]’ (設置cookie)

    它在客戶端瀏覽器上設置一個cookie。 cookie的名稱是NAME,其值是VAL。 domain字段是該cookie的域,好比’.apache.org’, 可選的lifetime是cookie生命期的分鐘數, 可選的path是cookie的路徑。

深刻閱讀:http://oss.org.cn/man/newsoft/ApacheManual/mod/mod_rewrite.html

全面理解.htaccess語法中RewriteCond和RewriteRule意義

 

來源網址: http://blog.sina.com.cn/s/blog_7048e38101017xdx.html

(2012-08-13 10:38:44)

關於.htaccess僞靜態的使用,章郎蟲一直沒有好好想過。之前一直是在網上找現成的,而後修改下網址實現重定向。今天我專門找資料看了下RewriteCond和RewriteRule的意思及使用方法。而後回過頭看《網站地址更改之htaccess和php的301重定向》這篇文章,終於有些理解。如今不用一直找現成的代碼,也能夠本身寫一些規則實現重定向了。下面就簡單的介紹下他們的用法。

RewriteCond的語法

RewriteCond TestString CondPattern [Flags]

其中的TestString是指一個文本格式的條件,例子中用的是環境變量名HTTP_HOST所包含的內容(Name= Value),這是一個map(鍵值對)格式的數據類型。

CondPattern是條件參數,這兒以第一個例子爲例,就是abc.com。

Flags標識是是第三個參數,能夠用來緊跟下一個條件,這兒用OR表示或者,若是沒有[Flags],則用隱含的AND,表示而且。其它的還能夠NC等等,表示忽略大小寫

RewriteCond就像咱們程序中的if語句同樣,表示若是符合某個或某幾個條件則執行RewriteCond下面緊鄰的RewriteRule語句,這就是RewriteCond最原始、基礎的功能,爲了方便理解,下面來看看幾個例子。

RewriteEngine on

RewriteCond %{HTTP_USER_AGENT} ^Mozilla/5.0.*

RewriteRule index.php index.m.php

RewriteCond %{HTTP_USER_AGENT} ^Lynx.*

RewriteRule index.php index.L.php

RewriteRule index.php index.b.php

上面語句的做用是當你是用FF瀏覽器訪問index.php這個文件的時候,會自動讓你訪問到index.m.php這個文件,當你是用一些移動終端訪問 的 時候,會讓你對index.php這個文件的訪問實際訪問的是index.L.php去,若是你是用其它的瀏覽器訪問的時候,會讓你跳到 index.b.php。

RewriteRule的語法

RewriteRule Pattern Substitution [Flags]

其中的Pattern就是參數,通常爲一些文件的擴展名,Substitution是用來替換前面用的,這兒的Flags,經常使用的R表示 redirect(強制重定向),F表示forbidden(禁止訪問),L表示last(最後),一般當你但願中止重寫操做而當即重定向時,可用它。

.htaccess中用到的正則

元字符^(和數字6在同一個鍵位上的符號)和$都匹配一個位置,這和\b有點相似。

^匹配你要用來查找的字符串的開頭

$匹配結尾。

好比一個網站若是要求你填寫的QQ號必須爲5位到12位數字時,可使用:^\d{5,12}$。

若是你對正則表達式不是很明白,能夠看下正則表達式的教程

Source from: http://www.hellonet8.com/897.html

 

URL重寫 htaccess文件寫法的10個技巧

 

來源網址: http://blog.sina.com.cn/s/blog_7069146d01015ikf.html

(2012-07-26 03:25:44)

「.htaccess」文件每每被網頁設計師們忽略。假如你還不知道什麼是htaccess的話,你能夠去查一下wikipedia。它是目錄級別的配置文件,有經常使用的網頁服務器支持這種配置,例如Apache。下面我將列出10條有用的.htaccess配置技巧。

1. 反盜鏈

那些盜用了你的內容,還不肯意本身存儲圖片的網站是無恥的。你能夠經過如下配置來放置別人盜用你的圖片:

RewriteBase /

RewriteCond %{HTTP_REFERER} !^$

RewriteCond %{HTTP_REFERER} !^http://(www.)?yoursite.com/.*$ [NC]

RewriteRule .(gif|jpg|swf|flv|png)$ /feed/ [R=302,L]

2. 防止目錄瀏覽

有時候目錄瀏覽是有用的,但大部分狀況會有安全問題。爲了讓你的網站更安全,你能夠經過htaccess文件來禁用這個功能:

Options All -Indexes

3. SEO友好的301永久重定向

這一招是我經常使用的。每次我更改網站URL結構的時候,我都會作301重定向:

Redirect 301 http://www.yoursite.com/article.html http://www.yoursite.com/archives/article 4. 顯示個性化的 404 錯誤頁面

當用戶訪問了一個不存在的頁面的時候,網頁服務器會顯示「404 file not found」錯誤。有不少CMS可讓你設置自定義的錯誤頁面,但最簡單的方法是更改htaccess:

ErrorDocument 404 /404.html

5. 設置目錄的默認頁面

假如你須要爲不一樣的目錄設置不一樣的默認頁面,你能夠很容易的經過 .htaccess 實現:

DirectoryIndex about.html

6. 基於referer來限制網站訪問

站長一般不會限制網站訪問,可是當你發現有一些網站盡給你帶來垃圾流量的話,你就應該屏蔽他們:

<IfModule mod_rewrite.c>

RewriteEngine on  RewriteCond %{HTTP_REFERER} spamteam.com [NC,OR]

RewriteCond %{HTTP_REFERER} trollteam.com [NC,OR]

RewriteRule .* – [F]

</ifModule>

7. 限制PHP上傳文件大小

這招在共享空間的服務器上頗有用,可讓個人用戶上傳更大的文件。第一個是設置最大的上傳文件大小,第二個是設置最大的POST請求大小,第三個PHP腳本最長的執行時間,最後一個是腳本解析上傳文件的最長時間:

php_value upload_max_filesize 20M

php_value post_max_size 20M

php_value max_execution_time 200

php_value max_input_time 200

8. 壓縮文件

你能夠經過壓縮文件來減小網絡流量,也頁面裝載時間:

AddOutputFilterByType DEFLATE text/plain

AddOutputFilterByType DEFLATE text/html

AddOutputFilterByType DEFLATE text/xml

AddOutputFilterByType DEFLATE text/css

AddOutputFilterByType DEFLATE application/xml

AddOutputFilterByType DEFLATE application/xhtml+xml

AddOutputFilterByType DEFLATE application/rss+xml

AddOutputFilterByType DEFLATE application/JavaScript

AddOutputFilterByType DEFLATE application/x-javascript

9. 緩存文件

這一點還須要解釋嗎?

<FilesMatch 「.(flv|gif|jpg|jpeg|png|ico|swf|js|css|pdf)$」>

Header set Cache-Control 「max-age=2592000〃

</FilesMatch>

10. 添加尾部的反斜槓

我並不肯定,可是不少文章,不少人都說添加尾部反斜槓有益於SEO:

<IfModule mod_rewrite.c>

RewriteCond %{REQUEST_URI} /+[^\.]+$

RewriteRule ^(.+[^/])$ %{REQUEST_URI}/ [R=301,L]

</IfModule>

====================

引用:http://www.c658.com/658/html/xxlm/itxxl/882.html

.htaccess基本語法和應用

.htaccess是Apache服務器的一個很是強大的分佈式配置文件。

正確的理解和使用.htaccess文件,能夠幫助咱們優化本身的服務器或者虛擬主機。

如何啓用htaccess

以windows爲例,進入apache/conf目錄,找到httpd.conf文件,去掉

LoadModule rewrite_module modules/mod_rewrite.so

前面的#,而後設置目錄屬性AllowOverride All,重啓apache便可

下面是一個典型的htaccess文件

           # 開啓URL重寫
RewriteEngine on
# URL重寫的做用域
# RewriteBase /path/to/url
# 知足怎樣的條件
RewriteCond %{HTTP_HOST} !^www\.example\.com$ [NC]
# 應用怎樣的規則
RewriteRule .? http://www.example.com%{REQUEST_URI} [R=301,L]

來看看RewriteCond,首先有一個%,由於{HTTP_HOST}是一個apache變量,須要用%來指示。從!開始就是匹配的條件,支持 正則。!表示不等於,這句話的意思就是:若是HTTP_HOST不是www.example.com。後面的[NC](no case)表示忽略大小寫,常見的還有

  • [L](last):終止一系列的RewriteCond和RewriteRule
  • [R](redirect):觸發一個顯示的跳轉,也能夠指定跳轉類型,如[R=301]
  • [F](forbidden):禁止查看特定文件,apache會觸發403錯誤

圖片防盜鏈

           RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www\.)?example\.com/ [NC]
RewriteRule \.(gif|jpg|png)$ - [F]

因爲是基於HTTP_REFERER的驗證,因此只能防止通常的圖片盜鏈,由於HTTP_REFERER是比較容易僞造的

自定義404錯誤頁面

若是用戶輸入了一個不存在的url,那麼就顯示自定義的錯誤頁面

           ErrorDocument 404 /404.html
# 其餘同理
ErrorDocument 500 /500.html

處理移動過的文件

           Redirect 301 /old.html http://yoursite.com/new.html
# 也能夠是下面這樣
RewriteRule /old.html http://yoursite.com/new.html [R=301,L]
# 若是想隱式跳轉(URL地址不變,但實際上內容是其餘URL的),就使用下面的
RewriteRule /old.html http://yoursite.com/new.html [L]

對於RewriteRule還有好多文章能夠作,好比

           # 把html後綴的url連接到php文件
# $1指代的是前面第1個用括號括起來的內容
RewriteRule ^/?([a-z/]+)\.html$ $1.php [L]
# 或者把舊文件夾的內容連接到新文件夾
RewriteRule ^/?old_directory/([a-z/.]+)$ new_directory/$1 [R=301,L]
# 隱藏文件名
RewriteRule ^/?([a-z]+)$ $1.php [L]
禁止顯示目錄列表

若是目錄裏沒有index文件,又沒有對該目錄作過特別的處理,尤爲是windows主機,那麼該目錄裏的內容就會顯示出來,這時能夠在根目錄建立 一個.htaccess文件,而後寫上

           Options -Indexes
# 就這麼一句就搞定了

阻止/容許特定IP/IP段

           # 禁止全部IP,除了指定的
order deny,allow
deny from all
# 若是想容許IP段,如123.123.123.0 ~ 123.123.123.255,則
# allow from 123.123.123.
allow from 123.123.123.123

ErrorDocument 403 /page.html

<Files page.html>
allow from all
</Files>

#若是想禁止特定IP
deny from 123.123.123.123

添加MIME類型

           AddType video/x-flv .flv
# 若是設置類型爲 application/octet-stream 將提示下載
AddType application/octet-stream .pdf

用.htaccess文件實現網站404錯誤

 

來源網址: http://www.os1010.com/archives/618

做者:admin  發表於:2012年06月11日 09:25  分類:SEO技術     字體: 小 中 

定義404錯誤 頁對網站SEO的做用仍是很大的,404 錯誤意味着連接指向的網頁不存在,即原始網頁的URL失效,這種狀況常常會發生,很難避免,當Web 服務器接到相似請求時,會返回一個404 狀態碼,告訴瀏覽器要請求的資源並不存在。可是,Web服務器默認的404錯誤頁面,十分呆板,並且對SEO是不利,對於網站流量也是很大的損失。

如今大多數主機都提供設置404頁面的接口,這樣的不管是國內主機仍是國外主機都很好設置,不過仍然有很多主機不提供設置頁面,這樣的可能是國內主機和一些免費主機,本文主要是針對這些主機,並且是針對PHP主機。

1. Apache下設置404錯誤頁面(通常是Linux主機)

(1)           在.htaccess 文件(若是沒有則新建一個)中加入以下內容:ErrorDocument 404 /404.html,將.htaccess文件上傳到網站根目錄

注:也可使用這樣的命令

ErrorDocument 404 http://www.iewb.net/404.htm

ErrorDocument 500 http://www.iewb.net/500.htm

(2)           製做一個404頁面,隨便您設計,命名爲404.html,一樣上傳到網站根目錄。若是您還想設置500頁面,還能夠在.htaccess命令里加上ErrorDocument 404 /500.html 並製做一個500頁面傳到網站根目錄

網友沒必要檢驗本站的404頁面了,由於本站用的是godaddy免費的空間,404頁面會有廣告。

本文由新將來博客(www.os1010.com)整理,轉載請註明!

本文固定連接: http://www.os1010.com/archives/618 | WordPress主機|香港主機空間|香港高速主機|新將來博客

由淺入深剖析.htaccess

 

來源網址: http://blog.csdn.net/cdefg198/article/details/6645759

2011-07-29 23:36 210人閱讀 評論(0) 收藏 舉報

一、.htaccess文件使用前提

.htaccess的主要做用就是實現url改寫,也就是當瀏覽器經過url訪問到服務器某個文件夾時,做爲主人,咱們能夠來接待這個url,具體地怎樣接待它,就是此文件的做用。全部的訪問都是經過URL實現,因此.htaccess的做用非同小可。正由於此,因此通常地網站經過設置.htaccess,經過一個十分友好的url吸引用戶進來,而後用.htaccess把用戶帶到須要訪問的位置。

要想使用這個強大功能,就得開啓apache裏面的重寫模塊。

前面的文章中曾經講到過windows和ubuntu開啓 rewrite模塊使用.htaccess 。

其實開啓模塊大致的步驟都是同樣的,不管是Windows和linux。

二、.htaccess基本語法介紹

開啓重寫引擎 :RewriteEngine on

設置重寫的根目錄:RewriteBase /     — 說明 :由於定義了這個文件夾,因此對應的替換就有了一個參照。

匹配全部符合條件的請求:RewriteCond       — 說明:RewriteCond 定義了一系列規則條件,這個指令能夠有一條或者多條,只有用戶拿來的url符合這些條件以後,咱們的.htaccess纔開始接待,不然用戶就直接本身去訪問所須要的目錄了。

舉個例子,爲了能讓搜索引擎更多地抓取咱們的網頁而避免重複抓,咱們一般把沒有www的域名重定向到www.XXX.com,以下就實現了這個功能:

RewriteEngine On

RewriteCond %{HTTP_HOST}  ^nbphp\.com$ [NC]

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

上例便把nbphp.com 重定向到www.nbphp.com

%{HTTP_HOST} 是指取得用戶訪問的URL的主域名  而後空格後面是一個正則表達式匹配,意識就是說是不是 nbphp.com 。

若是用戶訪問使用的URL知足全部列出的RewriteCond 提出的條件,那麼進行下一步RewriteRule 即開始進行引導,這纔開始實現.htaccess文件的重要功能。

一樣,前面是正則表達式,用戶分析用戶的除了主域名nbphp.com以外的URL ,^(.*)$的意思就是全部的內容。 而後空格後面寫的是咱們引導用戶訪問的目錄,咱們帶着他走到新的一個域名上。$1 指的是前面括號裏匹配url所獲得的內容。

這樣就是一個完整的小例子。關於RewriteCond裏 如何調用url的某個部分,咱們能夠參考這篇文章(Apache的Mod_rewrite學習 (RewriteCond重寫規則的條件);

三、現學現用,學習正則表達式。

推薦一個經典的教程: 正則表達式30分鐘入門教程

這個教程的確很簡單,看完基本上寫一些簡單的正則就沒有問題了。正則是一個須要長期使用的工具,隔段時間不用會忘記,因此我每次都看一遍這個教程。其實學過以後重要的就是一點內容。我簡單羅列了以下:

.  換行符之外的全部字符

\w匹配字母或數字或下劃線或漢字

\s匹配任意的空白符

\d匹配數字

\b匹配單詞的開始或結束

^匹配字符串的開始

$匹配字符串的結束

*重複零次或更屢次

*重複零次或更屢次

+重複一次或更屢次

?重複零次或一次

{n}重複n次

{n,}重複n次或更屢次

{n,m}重複n到m次

應用替換時,前面第一個()中匹配的內容後面就用$1引用,第二個()中匹配的就用$2應用……

推薦一個實用的正則在線測試網站 http://www.regextester.com/

咱們來分析一下 discuz7.0 搜索引擎優化 htaccess 裏面的重寫。

RewriteRule ^forum-([0-9]+)-([0-9]+)\.html$  forumdisplay.php?fid=$1&page=$2

首先加入用戶經過 nbphp.com/forum-2-3.html 訪問discuz論壇,那麼先經過.htaccess過濾,看看是否須要.htaccess引導一下用戶,若是知足列出的一系列RewriteCond的條件那麼就進行重寫,discuz的沒有列出RewriteCond 因此應該所有都進行重寫。因此開始進行轉寫,forum-2-3.html 這個正好符合 列出的^forum-([0-9]+)-([0-9]+)\.html$ 正則表達式。而且 $1 爲 2  ,$2爲3 ,因此代入後面,即 forumdisplay.php?fid=2&page=3 加上前面的RewriteBase 指定的文件目錄,那麼就帶他到制定目錄的forumdisplay.php?fid=2&page=3 。

四、常見的.htaccess應用舉例(部分例子引自四個例子實戰講解.htaccess文件rewrite規則)
4.1防止盜鏈,若是來得要訪問jpe jpg bmp png結尾的url 用戶不是來自咱們的網站,那麼讓他看一張咱們網站的展現圖片。

RewriteEngine On

RewriteCond %{HTTP_REFERER} !^http://(.+.)?mysite.com/ [NC]

RewriteCond %{HTTP_REFERER} !^$

RewriteRule .*.(jpe?g|gif|bmp|png)$ /images/nohotlink.jpg [L]

4.2 網站升級的時候,只有特定IP才能訪問,其餘的用戶將看到一個升級頁面

RewriteEngine on

RewriteCond %{REQUEST_URI} !/upgrade.html$

RewriteCond %{REMOTE_HOST} !^24\.121\.202\.30

RewriteRule $ http://www.nbphp.com/upgrade.html [R=302,L]

4.3把老的域名轉向新域名

# redirect from old domain to new domain

RewriteEngine On

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

五、一些其餘功能
5.1 引出錯誤文檔的目錄

ErrorDocument 400 /errors/badrequest.html

ErrorDocument 404   http://yoursite/errors/notfound.html

ErrorDocument 401 「Authorization Required

5.2 Blocking users by IP 根據IP阻止用戶訪問

order allow,deny

deny from 123.45.6.7

deny from 12.34.5. (整個C類地址)

allow from all

5.3 防止目錄瀏覽

# disable directory browsing

Options All -Indexes

5.4設置默認首頁

# serve alternate default index page

DirectoryIndex about.html

5.5 把一些老的連接轉到新的連接上——搜索引擎優化SEO

Redirect 301 /d/file.htmlhttp://www.htaccesselite.com/r/file.html

5.6爲服務器管理員設置電子郵件。

ServerSignature EMail

SetEnv SERVER_ADMINdefault@domain.com

相關文章
相關標籤/搜索