.htaccess文件(或者」分佈式配置文件」)提供了針對文件夾改變配置的方法。 即。在一個特定的文檔文件夾中放置一個包括一個或多個指令的文件, 以做用於此文件夾及其全部子文件夾。javascript
做爲用戶。所能使用的命令受到限制。管理員可以經過Apache的AllowOverride指令來設置。php
概述來講,htaccess文件是Apacheserver中的一個配置文件,它負責相關文件夾下的網頁配置。經過htaccess文件。可以幫咱們實現:網頁301重定向、本身定義404錯誤頁面、改變文件擴展名、贊成/阻止特定的用戶或者文件夾的訪問、禁止文件夾列表、配置默認文檔等功能。css
.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
來源網址: 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設置。很是多命令都不甚了了,查看、改動起來很是不方便。痛定思痛,潛心學習一下,知其因此然嘛~
學習前提:(不會的朋友要學習一下,才幹更好的理解如下的文字呢)
rewrite的語法格式:
RewriteEngine 用於開啓或停用rewrite功能。
rewrite configurations 不會本身主動繼承,所以你得給每個你想用 rewrite功能的虛擬主機文件夾中加上這個指令。
RewriteBase用於設定重寫的基準URL。在下文中,你可以看見RewriteRule可以用於文件夾級的配置文件裏 (.htaccess)並在局部範圍內起做用。即規則實際處理的僅僅是剝離了本地路徑前綴的一部分。處理結束後,這個路徑會被本身主動地附着回去。默認值 是」RewriteBase physical-directory-path」。
在對一個新的URL進行替換時,此模塊必須把這個URL又一次注入到server處理中。爲此。它必須知道其相應的URL前綴或者說URL基準。
一般,此前綴就是 相應的文件路徑。
但是,大多數站點URL不是直接相應於其物理文件路徑的,於是通常不能作這種假定! 因此在這種狀況下。就必須用RewriteBase指令來指定正確的URL前綴。
假設你的站點serverURL不是與物理文件路徑直接相應的,而又需要使用RewriteBase指令,則必須在每個相應的.htaccess文件裏指定 RewriteRule 。
RewriteCond指令定義了一個規則的條件,即。在一個RewriteRule指令以前有一個或多個RewriteCond指令。
條件以後的重寫規則僅在當前URI與pattern匹配並且符合這些條件的時候纔會起做用。
TestString是一個純文本的字符串,但是還可以包括下列可擴展的成分:
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 |
!
|
‘ 字符(驚歎號)來實現匹配的反轉。
1 |
RewriteOptions
|
指令爲當前server級和文件夾級的配置設置一些選項。
Option可以是下列值之中的一個:
1 |
inherit
|
1 |
.htaccess
|
中的條件和規則可以被繼承。
1 |
MaxRedirects=<var>number</var>
|
1 |
RewriteRule
|
的無休止的內部重定向, 在此類重定向和500內部server錯誤次數達到一個最大值的時候。
1 |
mod_rewrite
|
會中止對此請求的處理。 假設你確實需要對每個請求贊成大於10次的內部重定向,可以增大這個值。
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
以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’標記.
強制當前URL爲被禁止的,即,立刻反饋一個HTTP響應代碼403(被禁止的)。 使用這個標記,可以連接若干RewriteConds以有條件地堵塞某些URL。
強制當前URL爲已廢棄的。即。立刻反饋一個HTTP響應代碼410(已廢棄的)。 使用這個標記,可以標明頁面已經被廢棄而不存在了.
此標記使替換成分被內部地強制爲代理請求,並立刻(即, 重寫規則處理立刻中斷)把處理移交給代理模塊。
你必須確保此替換串是一個有效的(比方常見的以 http://hostname開頭的)可以爲Apache代理模塊所處理的URI。
使用這個標記,可以把某些遠程成分映射到本地server名稱空間, 從而加強了ProxyPass指令的功能。 注意: 要使用這個功能,代理模塊必須編譯在Apacheserver中。 假設你不能肯定,可以檢查「httpd -l」的輸出中是否有mod_proxy.c。 假設有,則mod_rewrite可以使用這個功能; 假設沒有,則必須啓用mod_proxy並又一次編譯「httpd」程序。
立刻中止重寫操做,並再也不應用其它重寫規則。 它相應於Perl中的last命令或C語言中的break命令。
這個標記可以阻止當前已被重寫的URL爲其後繼的規則所重寫。 舉例,使用它可以重寫根路徑的URL(‘/’)爲實際存在的URL, 比方, ‘/e/www/’.
又一次運行重寫操做(從第一個規則又一次開始). 這時再次進行處理的URL已經不是原始的URL了,而是經最後一個重寫規則處理的URL。
它相應於Perl中的next命令或C語言中的continue命令。 此標記可以又一次開始重寫操做,即, 立刻回到循環的頭部。 但是要當心,不要製造死循環!
此標記使當前規則與下一個(其自己又可以與其後繼規則相連接的。 並可以如此重複的)規則相連接。 它產生這樣一個效果: 假設一個規則被匹配,通常會繼續處理其後繼規則。 即。這個標記不起做用;假設規則不能被匹配。 則其後繼的連接的規則會被忽略。
比方。在運行一個外部重定向時。 對一個文件夾級規則集。你可能需要刪除「.www」 (此處不該該出現「.www」的)。
強制目標文件的MIME類型爲MIME-type。 比方,它可以用於模擬mod_alias中的ScriptAlias指令, 之內部地強制被映射文件夾中的所有文件的MIME類型爲「application/x-httpd-cgi」.
在當前請求是一個內部子請求時。此標記強制重寫引擎跳過該重寫規則。 比方,在mod_include試圖搜索可能的文件夾默認文件(index.xxx)時, Apache會內部地產生子請求。對子請求。它不必定實用的。而且假設整個規則集都起做用, 它甚至可能會引起錯誤。
因此,可以用這個標記來排除某些規則。 依據你的需要遵循下面原則: 假設你使用了有CGI腳本的URL前綴。以強制它們由CGI腳本處理。 而對子請求處理的出錯率(或者開銷)很是高。在這樣的狀況下,可以使用這個標記。
它使Pattern忽略大寫和小寫,即, 在Pattern與當前URL匹配時。’A-Z’ 和’a-z’沒有差異。
此標記強制重寫引擎在已有的替換串中追加一個請求串,而不是簡單的替換。 假設需要經過重寫規則在請求串中添加信息。就可以使用這個標記。
此標記阻止mod_rewrite對重寫結果應用常規的URI轉義規則。 普通狀況下,特殊字符(如’%’, ‘$’, ‘;’等)會被轉義爲等值的十六進制編碼。 此標記可以阻止這種轉義,以贊成百分號等符號出現在輸出中,如: RewriteRule /foo/(.*) /bar?arg=P1\%3d$1 [R,NE]
可以使’/foo/zed’轉向到一個安全的請求’/bar?arg=P1=zed’.
此標記強制重寫引擎將內部結構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。
此標記強制重寫引擎跳過當前匹配規則後繼的num個規則。 它可以實現一個僞if-then-else的構造: 最後一個規則是then從句,而被跳過的skip=N個規則是else從句. (它和’chain|C’標記是不一樣的!)
此標記使環境變量VAR的值爲VAL, VAL可以包括可擴展的反向引用的正則表達式$N和%N。 此標記可以屢次使用以設置多個變量。
這些變量可以在其後不少狀況下被間接引用,但通常是在XSSI (via or CGI (如 $ENV{‘VAR’})中。 也可以在後繼的RewriteCond指令的pattern中經過%{ENV:VAR}做引用。
使用它可以從URL中剝離並記住一些信息。
它在client瀏覽器上設置一個cookie。 cookie的名稱是NAME,其值是VAL。
domain字段是該cookie的域,比方’.apache.org’, 可選的lifetime是cookie生命期的分鐘數。 可選的path是cookie的路徑。
深刻閱讀:http://oss.org.cn/man/newsoft/ApacheManual/mod/mod_rewrite.html
來源網址: 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
來源網址: 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是Apacheserver的一個很強大的分佈式配置文件。
正確的理解和使用.htaccess文件,可以幫助咱們優化本身的server或者虛擬主機。
以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)表示忽略大寫和小寫。常見的還有
圖片防盜鏈
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
來源網址: 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主機|香港主機空間|香港快速主機|新將來博客
來源網址: http://blog.csdn.net/cdefg198/article/details/6645759
2011-07-29 23:36 210人閱讀 評論(0) 收藏 舉報
.htaccess的主要做用就是實現url改寫,也就是當瀏覽器經過url訪問到server某個目錄時。做爲主人,咱們可以來接待這個url,詳細地如何接待它。就是此文件的做用。所有的訪問都是經過URL實現,因此.htaccess的做用非同小可。正因爲此,因此通常地站點經過設置.htaccess。經過一個十分友好的url吸引用戶進來,而後用.htaccess把用戶帶到需要訪問的位置。
要想使用這個強大功能,就得開啓apache裏面的重寫模塊。
前面的文章中之前講到過windows和ubuntu開啓 rewrite模塊使用.htaccess 。
事實上開啓模塊大致的步驟都是同樣的,無論是Windows和linux。
開啓重寫引擎 :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 。
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^http://(.+.)?mysite.com/ [NC]
RewriteCond %{HTTP_REFERER} !^$
RewriteRule .*.(jpe?g|gif|bmp|png)$ /images/nohotlink.jpg [L]
RewriteEngine on
RewriteCond %{REQUEST_URI} !/upgrade.html$
RewriteCond %{REMOTE_HOST} !^24\.121\.202\.30
RewriteRule $ http://www.nbphp.com/upgrade.html [R=302,L]
# redirect from old domain to new domain
RewriteEngine On
RewriteRule ^(.*)$http://www.yourdomain.com/$1[R=301,L]
ErrorDocument 400 /errors/badrequest.html
ErrorDocument 404 http://yoursite/errors/notfound.html
ErrorDocument 401 「Authorization Required
order allow,deny
deny from 123.45.6.7
deny from 12.34.5. (整個C類地址)
allow from all
# disable directory browsing
Options All -Indexes
# serve alternate default index page
DirectoryIndex about.html
Redirect 301 /d/file.htmlhttp://www.htaccesselite.com/r/file.html
ServerSignature EMail
SetEnv SERVER_ADMINdefault@domain.com
本文章主要介紹了應用最廣最有用的重寫功能,記住.htaccess的權限要設置成644
原文連接: .htaccess具體解釋及.htaccess參數說明