server.htaccess 具體解釋以及 .htaccess 參數說明

.htaccess文件(或者」分佈式配置文件」)提供了針對文件夾改變配置的方法。 即。在一個特定的文檔文件夾中放置一個包括一個或多個指令的文件, 以做用於此文件夾及其全部子文件夾。javascript

做爲用戶。所能使用的命令受到限制。管理員可以經過Apache的AllowOverride指令來設置。php

概述來講,htaccess文件是Apacheserver中的一個配置文件,它負責相關文件夾下的網頁配置。經過htaccess文件。可以幫咱們實現:網頁301重定向、本身定義404錯誤頁面、改變文件擴展名、贊成/阻止特定的用戶或者文件夾的訪問、禁止文件夾列表、配置默認文檔等功能。css

.htaccess 具體解釋


.htaccess是什麼html

啓用.htaccess,需要改動httpd.conf。啓用AllowOverride,並可以用AllowOverride限制特定命令的使用。java

假設需要使用.htaccess之外的其它文件名稱,可以用AccessFileName指令來改變。好比,需要使用.config ,則可以在server配置文件裏按下面方法配置:AccessFileName .config 。linux

籠統地說,.htaccess可以幫咱們實現包含:文件夾password保護、用戶本身主動重定向、本身定義錯誤頁面、改變你的文件擴展名、封禁特定IP地址的用戶、僅僅贊成特定IP地址的用戶、禁止文件夾列表,以及使用其它文件做爲index文件等一些功能。web

工做原理apache

.htaccess文件(或者」分佈式配置文件」)提供了針對每個文件夾改變配置的方法,即在一個特定的文件夾中放置一個包括指令的文件,當中的指令做用於此文件夾及其所有子文件夾。
說明:
假設需要使用.htaccess之外的其它文件名稱,可以用AccessFileName指令來改變。ubuntu

好比。需要使用.config ,則可以在server配置文件裏按下面方法配置:
AccessFileName .config
一般,.htaccess文件使用的配置語法和主配置文件同樣。AllowOverride指令按類別決定了.htaccess文件裏哪些指令纔是有效的。假設一個指令贊成在.htaccess中使用,那麼在本手冊的說明中,此指令會有一個覆蓋項段,當中說明了爲使此指令生效而必須在AllowOverride指令中設置的值。windows

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

普通狀況下。不該該使用.htaccess文件。除非你對主配置文件沒有訪問權限。

有一種非常常見的誤解。以爲用戶認證僅僅能經過.htaccess文件實現。事實上並不是這樣。把用戶認證寫在主配置文件裏是全然可行的,而且是一種很是好的方法。


.htaccess文件應該被用在內容提供者需要針對特定文件夾改變server的配置而又沒有root權限的狀況下。

假設server管理員不肯意頻繁改動配置,則可以贊成用戶經過.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 ,儘管這樣的狀況並很少。

)

其次是安全。

這樣會贊成用戶本身改動server的配置,這可能會致使某些意想不到的改動。因此請認真考慮是否應當給予用戶這種特權。但是,假設給予用戶較少的特權而不能知足其需要,則會帶來額外的技術支持請求。因此,必須明白地告訴用戶已經給予他們的權限。說明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文件隨便添加點無心義的垃圾內容,假設server沒有返回了一個錯誤消息,那麼差點兒可以判定設置了 AllowOverride None 。
在訪問文檔時,假設收到server的出錯消息,應該檢查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://」和「/」,^表示 字符串開始。$表示字符串結尾,\.表示轉義的. ,假設不轉義也行。推薦轉義,防止有些server不支持,?表示前面括號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是否爲一個有效的文件,而且可以在server當前的訪問控制配置下被訪問。

它使用一個內部子請求來作檢查。由於會減小server的性能,因此請慎重使用!

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

檢查TestString是否爲一個有效的URL,而且可以在server當前的訪問控制配置下被訪問。

它使用一個內部子請求來作檢查,由於會減小server的性能,因此請慎重使用!

【RewriteRule語法:】

RewriteRule Pattern Substitution [flags]

【flags】

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

此標記使當前規則與下一個規則相連接。

它產生這種效果:假設一個規則被匹配,則繼續處理其後繼規則。也就是這個標記不起做用;假設該規則不被匹配。則其後繼規則將被跳過。

比方,在一個文件夾級規則中運行一個外部重定向時。你可能需要刪除」.www」(此處不該該出現」.www」)。

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

在client設置一個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開頭),不然將獲得一個代理模塊返回的錯誤。使用這個標記,能夠把某些遠程成分映射到本地server域名空間,從而加強了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反饋給client,如將」/~」重寫爲」/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又一次注入到server處理中。爲此。它必須知道其相應的URL前綴或者說URL基準。

一般,此前綴就是 相應的文件路徑。

但是,大多數站點URL不是直接相應於其物理文件路徑的,於是通常不能作這種假定! 因此在這種狀況下。就必須用RewriteBase指令來指定正確的URL前綴。

假設你的站點serverURL不是與物理文件路徑直接相應的,而又需要使用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. server變量: 引用方法是 %{ 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頭、Apacheserver的C變量以及Unix系統中的 struct tm字段,大多數都在其它的手冊或者CGI規範中有所講述。

而當中爲mod_rewrite所特有的變量有:

IS_SUBREQ

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

API_VERSION

這是正在使用的httpd中(server和模塊之間內部接口)的Apache模塊API的版本號, 其定義位於include/ap_mmn.h中。此模塊版本號相應於正在使用的Apache的版本號 (比方,在Apache 1.3.14的發行版中,這個值是19990320:10)。

一般,對它感興趣的是模塊的做者。

THE_REQUEST

這是由瀏覽器發送給server的完整的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

指令爲當前server級和文件夾級的配置設置一些選項。

 Option可以是下列值之中的一個:

1
inherit
此值強制當前配置可以繼承其父配置。 在虛擬主機級配置中,它意味着主server的映射表、條件和規則可以被繼承。 在文件夾級配置中,它意味着其父文件夾的
1
.htaccess

中的條件和規則可以被繼承。

1
MaxRedirects=<var>number</var>
爲了不文件夾級
1
RewriteRule

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

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}

    )的server變量

  • 映射函數調用(
    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的樣例,現在看來是否是很是easy了?

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反饋給client,如, 重寫「/~」爲 「/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。

    使用這個標記,可以把某些遠程成分映射到本地server名稱空間, 從而加強了ProxyPass指令的功能。 注意: 要使用這個功能,代理模塊必須編譯在Apacheserver中。 假設你不能肯定,可以檢查「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)

    它在client瀏覽器上設置一個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。

它是文件夾級別的配置文件,有常用的網頁server支持這樣的配置,好比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 錯誤頁面

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

ErrorDocument 404 /404.html

5. 設置文件夾的默認頁面

假如你需要爲不一樣的文件夾設置不一樣的默認頁面,你可以很是easy的經過 .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上傳文件大小

這招在共享空間的server上很是實用,可以讓個人用戶上傳更大的文件。

第一個是設置最大的上傳文件大小。第二個是設置最大的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是Apacheserver的一個很強大的分佈式配置文件。

正確的理解和使用.htaccess文件,可以幫助咱們優化本身的server或者虛擬主機。

怎樣啓用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是比較easy僞造的

本身定義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 server接到相似請求時。會返回一個404 狀態碼,告訴瀏覽器要請求的資源並不存在。

但是,Webserver默認的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訪問到server某個目錄時。做爲主人,咱們可以來接待這個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分鐘新手教程

這個教程的確很是easy。看完基本上寫一些簡單的正則就沒有問題了。正則是一個需要長期使用的工具,隔段時間不用會忘記。因此我每次都看一遍這個教程。

事實上學過以後重要的就是一點內容。

我簡單羅列了例如如下:

.  換行符之外的所有字符

\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爲server管理員設置電子郵件。

ServerSignature EMail

SetEnv SERVER_ADMINdefault@domain.com

本文章主要介紹了應用最廣最有用的重寫功能,記住.htaccess的權限要設置成644

原文連接: .htaccess具體解釋及.htaccess參數說明

©本文由 呂 收集整理。引用內容若有犯權請留言,轉載請註明原文連接

相關文章
相關標籤/搜索