.htaccess 語法以及應用

【轉】 php

http://blog.sina.com.cn/s/blog_6e8b46e701014drc.html   html

http://blog.sina.com.cn/s/blog_6e8b46e701014dtu.html正則表達式

   

.htaccess是Apache服務器的一個很是強大的分佈式配置文件。 正確的理解和使用.htaccess文件,能夠幫助咱們優化本身的服務器或者虛擬主機。apache

如何啓用htaccess 以windows爲例,進入apache/conf目錄,找到httpd.conf文件,去掉 LoadModule rewrite_module modules/mod_rewrite.so 前面的#,而後設置目錄屬性AllowOverride All,重啓apache便可windows

常見格式api

下面是一個典型的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)表示忽略大小寫,常見的還有cookie

  • [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
 

allow from all

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

添加MIME類型

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

 

上文htaccess語法詳細解釋與用例分析中對RewriteCond和RewriteRule的用法進行了舉例分析,本文將詳細描述上述兩個命令的使用格式,與所使用的變量和規則。這篇文章很長啊哈,請認真閱讀,內容都頗有用哦。

RewriteCond指令格式

【說明】定義重寫發生的條件
【語法】RewriteCond TestString CondPattern [flags]

RewriteCond指令定義一條規則條件。在一條RewriteRule指令前面可能會有一條或多條RewriteCond指令,只有當RewriteCond的條件(CondPattern)匹配成功時,RewriteRule的重寫規則才被應用於當前URL處理。

TestString是一個純文本的字符串,除了包含普通的字符外,還能夠包括下列的變量結構擴展:

RewriteMap擴展:引用方法是:${mapname:key|default} 細節請參見RewriteMap指令 。

TestString能夠包含服務器變量 ,引用方法是:%{NAME_OF_VARIABLE}

NAME_OF_VARIABLE能夠是下表列出的字符串之一:

HTTP頭鏈接與請求 服務器自身 日期和時間 其它
HTTP_USER_AGENT DOCUMENT_ROOT TIME_YEAR API_VERSION
HTTP_REFERER SERVER_ADMIN TIME_MON THE_REQUEST
HTTP_COOKIE SERVER_NAME TIME_DAY REQUEST_URI
HTTP_FORWARDED SERVER_ADDR TIME_HOUR REQUEST_FILENAME
HTTP_HOST SERVER_PORT TIME_MIN IS_SUBREQ
HTTP_PROXY_CONNECTION SERVER_PROTOCOL TIME_SEC HTTPS
HTTP_ACCEPT SERVER_SOFTWARE TIME_WDAY  
REMOTE_ADDR   TIME  
REMOTE_HOST      
REMOTE_PORT      
REMOTE_USER      
REMOTE_IDENT      
REQUEST_METHOD      
SCRIPT_FILENAME      
PATH_INFO      
QUERY_STRING      
AUTH_TYPE      

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

IS_SUBREQ

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

API_VERSION

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

THE_REQUEST

這是由瀏覽器發送的完整的HTTP請求行(好比:」GET /index.html HTTP/1.1″)。 它不包含任何瀏覽器發送的其它頭信息。

REQUEST_URI

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

REQUEST_FILENAME

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

HTTPS

若是鏈接使用了SSL/TLS,它將包含字符串」on」,不然就是」off」(不管mod_ssl 是否已經加載,該變量均可以安全的使用)。

其它注意事項:

SCRIPT_FILENAME和 REQUEST_FILENAME包含的值是相同的——即Apache服務器內部的request_rec結構中的 filename字段。 第一個就是你們都知道的CGI變量名,而第二個則是REQUEST_URI(request_rec結構中的uri字段)的一個副本。

  1. 特殊形式:%{ENV:variable} ,其中的variable能夠是任意環境變量。 它是經過查找Apache內部結構或者(若是沒找到的話)由Apache服務器進程經過getenv()獲得的。
  2. 特殊形式:%{SSL:variable} ,其中的variable能夠是一個SSL環境變量 的名字,不管mod_ssl 模塊是否已經加載均可以使用(未加載時爲空字符串)。 好比:%{SSL:SSL_CIPHER_USEKEYSIZE}將會被替換爲128。
  3. 特殊形式:%{HTTP:header} ,其中的header能夠是任意HTTP MIME頭的名稱。 它老是能夠經過查找HTTP請求而獲得。 好比:%{HTTP:Proxy-Connection}將被替換爲Proxy-Connection:HTTP頭的值。
  4. 預設形式:%{LA-U:variable} ,variable的最終值在執行一個內部(基於URL的)子請求後肯定。 當須要使用一個目前未知可是會在以後的過程當中設置的變量的時候,就可使用這個方法。 例如,須要在服務器級配置(httpd.conf文件)中根據REMOTE_USER變量進行重寫, 就必須使用%{LA-U:REMOTE_USER}。 由於此變量是由URL重寫(mod??_rewrite)步驟以後的認證步驟設置的。 可是另外一方面,由於mod_rewrite是經過API修正步驟來實現目錄級(.htaccess文件)配置的, 而認證步驟先於API修正步驟,因此能夠用%{REMOTE_USER}。
  5. 預設形式:%{LA-F:variable} ,variable的最終值在執行一個內部(基於文件名的)子請求後肯定。 大多數狀況下和上述的LA-U是相同的。

●CondPattern是條件模式,即一個應用於當前TestString實例的正則表達式。TestString將被首先計算,而後再與CondPattern匹配。

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

一、能夠在CondPattern串的開頭使用」!’(驚歎號)來指定 不匹配 。
二、CondPatterns有若干特殊的變種。 除了正則表達式的標準用法,還有下列用法:

將CondPattern視爲純字符串,與TestString按詞典順序進行比較。 若是TestString小於CondPattern則爲真。
「>CondPattern」————-(詞典順序的大於)

將CondPattern視爲純字符串,與TestString按詞典順序進行比較。 若是TestString大於CondPattern則爲真。
「=CondPattern」————-(詞典順序的等於)

將CondPattern視爲純字符串,與TestString按詞典順序進行比較。 若是TestString等於CondPattern(兩個字符串逐個字符地徹底相等)則爲真。

若是CondPattern是」"—(兩個雙引號),則TestString將與空字符串進行比較。
「-d」————-(目錄)

將TestString視爲一個路徑名並測試它是否爲一個存在的目錄。
「-f 「————-(常規文件)

將TestString視爲一個路徑名並測試它是否爲一個存在的常規文件。
「-s 「————-(非空的常規文件)

將TestString視爲一個路徑名並測試它是否爲一個存在的、尺寸大於0的常規文件。
「-l 「————-(符號鏈接)

將TestString視爲一個路徑名並測試它是否爲一個存在的符號鏈接。
「-x 「————-(可執行)

將TestString視爲一個路徑名並測試它是否爲一個存在的、具備可執行權限的文件。 該權限由操做系統檢測。
「-F 「————-(對子請求存在的文件)

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

檢查TestString是否爲一個有效的URL,並且能夠在服務器當前的訪問控制配置下被訪問。 它使用一個內部子請求來作檢查,因爲會下降服務器的性能,因此請謹慎使用!
注意: 全部這些測試均可以用驚歎號做前綴(「!」)以實現測試條件的反轉。

●在CondPattern以後追加特殊的標記[flags] 做爲RewriteCond指令的第三個參數。flags是一個以逗號分隔的如下標記的列表:

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

它使測試忽略大小寫,擴展後的TestString和CondPattern中’AZ’ 和’a-z’是沒有區別的。 此標記僅用於TestString和CondPattern的比較,而對文件系統和子請求的檢查不起做用。
「ornext|OR」—————(或下一條件)

代碼簡寫 全寫 解釋
R[=code]  redirect 強制外部重定向
F  forbidden 禁用URL,返回403HTTP狀態碼。
G  gone 強制URL爲已廢棄的
P  proxy 強制使用代理轉發。
L  last 代表當前規則是最後一條規則,中止分析之後規則的重寫。
N  next 從新從第一條規則開始運行重寫過程。
C  chain 與下一條規則關聯
若是規則匹配則正常處理,該標誌無效,若是不匹配,那麼下面全部關聯的規則都跳過。
T=MIME-type  type 強制MIME類型
NS  nosubreq 只用於不是內部子請求
NC  nocase 不區分大小寫
QSA  qsappend 追加請求字符串
NE  noescape 不在輸出轉義特殊字符
PT  passthrough 傳遞給下一個處理
S=num  skip 跳過num條規則
E=VAR:VAL  env 設置環境變量
CO=NAME:VAL:domain[:lifetime[:path]]  cookie 設置cookie

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’標記.

forbidden|F (強制URL爲被禁止的 forbidden)

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

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

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

proxy|P (強制爲代理 proxy)

此標記使替換成分被內部地強制爲代理請求,並立 即(即, 重寫規則處理當即中斷)把處理移交給代理模塊。 你必須確保此替換串是一個有效的(好比常見的以 http://hostname開頭的)可以爲Apache代理模塊所處理的URI。 使用這個標記,能夠把某些遠程成分映射到本地服務器名稱空間, 從而加強了ProxyPass指令的功能。

注意: 要使用這個功能,代理模塊必須編譯在Apache服務器中。 若是你不能肯定,能夠檢查「httpd -l」的輸出中是否有mod_proxy.c。 若是有,則mod_rewrite可使用這個功能; 若是沒有,則必須啓用mod_proxy並從新編譯「httpd」程序。

last|L (最後一個規則 last)

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

next|N (從新執行 next round)

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

chain|C (與下一個規則相連接 chained)

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

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

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

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

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

根據你的須要遵循如下原則: 若是你使用了有CGI腳本的URL前綴,以強制它們由CGI腳本處理, 而對子請求處理的出錯率(或者開銷)很高,在這種狀況下,可使用這個標記。

nocase|NC (忽略大小寫 no case)

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

qsappend|QSA (追加請求串 query string append)

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

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

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

RewriteRule /foo/(.*) /bar?arg=P1\=$1 [R,NE] 可使’/foo/zed’轉向到一個安全的請求’/bar?arg=P1=zed’.

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。

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

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

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

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

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

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

●舉例說明RewriteCond命令規則

RewriteCond %{REMOTE_HOST} ^andelse.com [OR]
RewriteCond %{REMOTE_HOST} ^*.andelse.com
RewriteRule …針對這2個主機的規則集

RewriteCond % { HTTP_USER_AGENT }  ^Mozilla.*
RewriteRule ^/$ /homepage. max .html  [ L ]
若是你使用的瀏覽器識別標誌是’Mozilla’,則你將獲得內容最大化的主頁homepage. max .html(含有Frames等等)。

RewriteRule指令格式

【說明】定義重寫的規則
【語法】RewriteRule Pattern rewritePattern [flags]

RewriteRule指令,能夠定義一條重寫 規則,規則間的順序很是重要。對Apache1.2及之後的版本,模板(Pattern)是一個POSIX正則式,用以匹配當前的URL。當前的URL不 必定是最初提交的URL,由於可能用一些規則在此規則前已經對URL進行了處理。rewritePattern 大多數文章寫爲Substitution ,這裏爲了更清楚的認識故寫爲rewritePattern 。

●Pattern 可使用以下特殊匹配規則,如php等其餘語言類似。

「.」 ——————- 換行符之外的全部字符
「\w」 —————- 匹配字母或數字或下劃線或漢字
「\s」 —————– 匹配任意的空白符
「\d」 —————– 匹配數字
「\b」 —————– 匹配單詞的開始或結束
「^」 —————— 匹配字符串的開始
「$」 —————— 匹配字符串的結束
「*」 —————— 重複零次或更屢次
「+」 —————— 重複一次或更屢次
「?」 ——————- 重複零次或一次
「{n}」 —————- 重複n次
「{n,}」 ————— 重複n次或更屢次
「{n,m}」 ————- 重複n到m次
「[0-9]」 ————– 匹配單個數字

rewritePattern 是針對Pattern 匹配後的URL進行rewritePattern 規定的替換。應用替換時,前面Pattern 第一個()中匹配的內容後面rewritePattern 就能夠用$1引用,第二個()中匹配的就用$2應用……以此類推。

●在rewritePattern 以後追加特殊的標記[flags] 做爲RewriteRule 指令的第三個參數。flags可使用的標記,和上面RewriteCond使用的同樣

●舉例說明RewriteRule語法

RewriteRule index.html index.php

好比:http://www.andelse.cn/index.html  -> http://www.andelse.cn/index.php

RewriteRule ^test([0-9]*).html$ test.php?id=$1

好比:http://www.andelse.cn/test8.html  -> http://www.andelse.cn/test.php?id=8

RewriteRule ^cat-([0-9]+)-([0-9]+)\.html$ cat.php?id1=$1&id2=$2

好比:http://www.andelse.cn/cat-1-3.html -> http://www.andelse.cn/cat.php?id1=1&id2=3

RewriteRule ^cat-([a-zA-Z0-9\-]*)-([0-9]+)-([0-9]+)\.html$ cat.php?id0=$1&id1=$2&id2=$3

好比:http://www.andelse.cn/cat-zbc2ac-3-5.html -> http://www.andelse.cn/cat.php?id0=zbc2ac&id1=3&id2=5

RewriteRule ^cat1-([0-9]+)-([0-9]+)-([0-9]+)\.html$ cat1.php?id1=$1&id2=$2&id3=$3

好比:http://www.andelse.cn/cat1-4-3-8.html -> http://www.andelse.cn/cat1.php?id1=4&id2=3&id3=8

RewriteRule ^cat([0-9]*)/$ cat.php?id1=$1

好比:http://www.andelse.cn/cat5/ -> http://www.andelse.cn/cat.php?id1=5

RewriteRule ^catm([0-9]*)/([0-9]*)/$ catm.php?id1=$1&id2=$2

好比:http://www.andelse.cn/catm6/3/ -> http://www.andelse.cn/catm.php?id1=6&id2=3

相關文章
相關標籤/搜索