標籤:style blog http os io 使用 ar for 檔案
.htaccess存取控制(Allow/Deny) 1. 驗證是否支援
.htaccess
在目錄下建立一個.htaccess
檔案,隨筆輸入一串字元(毫無意義),看看什麼反應,如果是500錯誤,說明目前環境是支援 .htaccess
的
fjdklsaj
轉載請註明: http://www.cnblogs.com/ganiks/2. deny from all
# no one gets in here!deny from all
3. Order命令
Order命令是一個痛點,也是配置apache的基礎,它決定了Apache處理訪問規則的順序。
通過Allow,Deny參數,Apache首先找到並應用Allow命令,然後應用Deny命令,以阻止所有訪問。
通過Deny,Allow參數,Apache首先找到並應用Deny命令,然後應用Allow命令,以允許所有訪問。
假設本地的IP為 192.168.4.126
Order Deny,AllowDeny from AllAllow from 192.168.4.126
本地訪問成功,非本地IP訪問 403
Forbidden4. 利用.htaccess過濾網域名稱或網路主機(Allow/Deny)
下例可以限制所有含有“domain.com”的網路主機訪問網站:
Order Allow,DenyAllow from allDeny from .*domain\.com.*
5. 禁止訪問指定檔案
Order Deny,AllowDeny from AllAllow from 192.168.4.126 <Files favicon.ico>order allow,denydeny from all</Files>
6. 禁止訪問指定類型的檔案
Order Deny,AllowDeny from AllAllow from 192.168.4.126 <FilesMatch ".(txt|ico)$">order allow,denydeny from all</FilesMatch>
Files之後的波浪線用於開啟“Regex”分析。請注意,這是個過時的用法,Apache更推薦使用指令[3]
Regex必須在雙引號之間,有關htaccess的Regex用法,請查閱本站《.htaccessRegex》一文。
雙引號中的“管道符”(|)用於將兩種檔案類型(.log和.exe)分開,相當於邏輯“或”
Order命令必須嵌在Files節(Section)中,否則將會應用到所有檔案
Satisfy All表示必須同時滿足主機分級(Allow/Denay)和使用者層級(Require)的限制,All是預設值,該行可以省略。
利用.htaccess進行密碼保護與驗證
暫不研究瀏覽目錄與首頁1. 啟用和禁用瀏覽目錄
Options All -IndexesIndexIgnore *Options All +Indexes
這3種設定分別對應下面3個圖:
2. 禁用瀏覽某些檔案
IndexIgnore *.php *.txt~ Copy*
3. 自訂瀏覽目錄頁面的style
<IfModule mod_autoindex.c> IndexOptions FancyIndexing </ifModule>
http://corz.org/public/images/demo/
http://corz.org/server/resources/file_view.htaccess.txt?raw=true4. 配置目錄首頁檔案
DirectoryIndex index.html index.php index.htm
5. 配置錯誤頁面
# custom error documentsErrorDocument 401 /err/401.phpErrorDocument 403 /err/403.phpErrorDocument 404 /err/404.phpErrorDocument 500 /err/500.php
URL重寫與URL重新導向
一、準備開始:mod_rewrite二、利用.htaccess實現URL重寫(rewrite)與URL重新導向(redirect)將.htm頁面映射到.php臨時重新導向(R=302)與永久重新導向(R=301)為什麼要用重新導向?——重新導向和URL重寫的區別長短地址轉換去掉www加上www支援多網域名稱訪問三、改寫查詢字串QUERY_STRING利用QSA轉換查詢字串QUERY_STRING利用RewriteCond改寫查詢字串QUERY_STRINGQSA與RewriteCond雙劍齊發剝離查詢字串四、利用RewriteCond和RewriteRule進行存取控制檔案存取控制用.htaccess阻止User-agent用.htaccess阻止盜鏈(hot-linking)References
1. 準備開始:
mod_rewrite
sudo a2enmod rewrite
<IfModule mod_rewrite.c> Options +FollowSymlinks RewriteEngine on # More rules below ...</IfModule>
FollowSymlinks
必須啟用,這是 rewrite 引擎的安全需求
mod_rewrite
會處理所有的提交給Apache 的URL請求, 並與之後的規則進行匹配
2. 利用
.htaccess
實現URL重寫和URL重新導向2.1 將
.htm
頁面映射到
.php
頁面
<IfModule mod_rewrite.c> Options +FollowSymlinks RewriteEngine on RewriteRule ^(.*)\.htm$ $1.php [NC]</IfModule>
[NC] No Case(不區分大小寫): 對用戶端請求的URL不區分大小寫
如果通過.htm進入,瀏覽器地址欄顯示的是.htm副檔名,但伺服器上實際執行的是.php
必須保證伺服器上有對應的.php,否則會404
瀏覽器和搜尋引擎可以同時通過.htm和.php訪問網頁
test.htm
this is .htm
test.php
this is .php2.2 臨時重新導向(R=302)與永久重新導向(R=301)
<IfModule mod_rewrite.c> RewriteEngine on RewriteBase / RewriteRule ^(.*)\.htm$ $1.php [R,NC,L]</IfModule>
注意事項:
<IfModule mod_rewrite.c> RewriteEngine on RewriteBase / RewriteRule ^(.*)$ http://newdomain/$1 [R=301,NC,L]</IfModule>
- 這個規則告訴瀏覽器和搜尋引擎,網站地址發生了永久性變更,使用者的URL請求將會被發送給新的網域名稱(主機)處理。
- 由於是重新導向到新的主機地址,RewriteBase也就沒有出現的必要了。
2.3 為什麼要重新導向——重新導向和URL重寫的區別
- 通過重新導向,瀏覽器知道頁面位置發生變化,從而改變地址欄顯示的地址
- 通過重新導向,搜尋引擎意識到頁面被移動了,從而更新搜尋引擎索引,將原來失效的連結從搜尋結果中移除
- 臨時重新導向(R=302)和永久重新導向(R=301)都是親搜尋引擎的,是SEO的重要技術
- URL重寫用於將頁面映射到本站另一頁面,若重寫到另一網路主機(網域名稱),則按重新導向處理
2.4 長短地址轉換
利用URL重寫,我們可以很方便地實現長短地址的轉換,但是用重新導向就不合適了。
RewriteEngine OnRewriteRule ^grab /public/files/download/download.php
若訪問
http://mysite/grab?file=my.zip
則會執行該頁面:
http://mysite/public/files/download/download.php?file=my.zip
2.5 去掉 www
<IfModule mod_rewrite.c> Options +FollowSymlinks RewriteEngine on RewriteCond %{HTTP_HOST} ^www\.(.*) [NC] RewriteRule ^(.*)$ http://%1/$1 [R=301,NC,L]</IFModule>
2.6 加上 www
<IfModule mod_rewrite.c> Options +FollowSymlinks RewriteEngine on RewriteCond %{HTTP_HOST} ^(.*)$ RewriteRule (.*) http://www\.%1/$1 [R=301,L]</IFModule>
2.7 支援多網域名稱訪問
如果你不湊巧買到了不支援多網域名稱的主機,那麼.htaccess或許可以協助你。現在假設你有網域名稱domain-one.com和domain- two.com,並且在伺服器根目錄有對應檔案夾one和two,那麼通過下面的改寫就能讓Apache同時接受者兩個網域名稱的請求:
#two domains served from one root..RewriteCond %{HTTP_HOST} domain-one.comRewriteCond %{REQUEST_URI} !^/oneRewriteRule ^(.*)$ /one/$1 [L]RewriteCond %{HTTP_HOST} domain-two.comRewriteCond %{REQUEST_URI} !^/twoRewriteRule ^(.*)$ /two/$1 [L]
3. 改寫查詢字串
QUERY_STRING
查詢字串是指URL請求中“問號”後面的部分。比如,http://mysite/grab?foo=bar 中粗體部分就是查詢字串,其中變數名是foo,值是bar。
3.1 利用 QSA 轉換查詢字串 QUERY_STRING
QSA(Query String Appending) 用於在 URI中截取查詢字串, 這個截取操作室通過小括弧正則實現的
RewriteEngine OnRewriteRule /pages/(.+) /page.php?page=$1 [QSA]RewriteRule ^/([^/]+)/([^/]+)/? /index.php?first-var=$1&second-var=$2 [QSA]
這裡通過 QSA , 將簡單的連結 /simple/flat/link/
映射到 server-side.php?first-val=flat&second-var=link
- 將會把請求
/pages/123?one=two
映射到 /page.php?page=123&one=two
- 如果沒有 QSA標誌,將會映射到
/page.php?page=123
- 如果沒有用到小括弧正則,就不需要QSA,像《長短地址轉換》中一樣
- 小括弧Regex可以截取查詢字串中的內容,但是如果沒有開啟QSA標誌,那麼
/page.php?page=$1
中 問號之後的部分將會剝離丟棄。
3.2 利用RewriteCond改寫查詢字串QUERY_STRING
RewriteEngine OnRewriteCond %{QUERY_STRING} foo=(.*)RewriteRule ^grab(.*) /page.php?bar=%1
- 該規則將訪問請求http://mysite/grab?foo=bar 轉換為 http://mysite/page.php?bar=bar
- RewriteCond用於捕獲查詢字串(QUERY_STRING)中變數foo的值,並儲存在%1中
- QUERY_STRING是Apache定義的“變數=值”向量(數組)
3.3 QSA與RewriteCond雙劍齊發
RewriteEngine OnRewriteCond %{QUERY_STRING} foo=(.+)RewriteRule ^grab/(.*) /%1/index.php?file=$1 [QSA]
- 會把 /grab/foobar.zip?level=5&foo=bar 映射到 /bar/index.php?file=foobar.zip&level=5&foo=bar
- 轉換後根目錄是bar目錄
- foobar.zip?level=5中的“問號”變成了foobar.zip&level=5中的“與”符號
3.4 剝離查詢字串
只需在要開始剝離的連結後面加個“問號”,並且不要啟用QSA標誌,就可剝離查詢字串
RewriteEngine On# Whatever QS isRewriteCond %{QUERY_STRING} . # I don‘t want it with Question markRewriteRule foo.php(.*) /foo.php? [L]
4. 利用
RewriteCond
和
RewriteRule
進行存取控制
我們在第一篇.htaccess基礎中提到了很多有用的存取控制方法,其實通過Rewrite也能實作類別似的功能,而且可以更強大!
4.1 檔案存取控制
之前利用Order、Files及FilesMatch命令實現的存取控制可以滿足大部分要求,但是當使用者被拒絕時,他們看到的是碩大的“403 Forbidden”,如果你不想傷害使用者的感情,就需要顯示一些別的東西,通過Rewrite就可以實現這個特性:
RewriteEngine OnRewriteCond %{REQUEST_FILENAME} !^(.+)\.css$RewriteCond %{REQUEST_FILENAME} !^(.+)\.js$RewriteCond %{REQUEST_FILENAME} !special.zip$RewriteRule ^(.+)$ /chat/ [NC]
該規則將僅允許使用者請求.css, .js類型的檔案,還有special.zip檔案
RewriteRule 後面指定了限制規則:映射到/char/目錄下處理
RewriteCond 後面的“驚嘆號”(!)起到了“否定”作用,它表明,對不滿足後面Regex者應用RewriteRule規則,也就是對當前類型的檔案將不應用規則
RewriteCond 之間是以邏輯“與”串連的,也就是只有當三個條件都不滿足時才執行RewriteRule
該規則也會限制訪問.htm, .jpg等格式
該規則不可以放在虛擬網站根目錄(/)下,否則會死迴圈
如果是二級目錄,如/test/,那麼傳入RewriteCond的參數是以/test/開始的,因此從(.+)獲得的檔案名稱也含有/test/,讀者必須對此多加小心
要想僅獲得檔案名稱,可以將(.+)替換成([^/]+),並且去掉符號^,如下所示:
RewriteEngine OnRewriteCond %{REQUEST_FILENAME} !([^/]+)\.css$RewriteCond %{REQUEST_FILENAME} !([^/]+)\.js$RewriteRule ^(.+)$ /chat/ [NC]
4.2 用.htaccess阻止User-agent
什麼是User-agent?User-agent用於瀏覽器向伺服器“自報家門”,更確切的說是所有HTTP用戶端都得用User-agent向 伺服器“自報家門”,以便伺服器對不同的用戶端作出不同響應。比如,某網站可能需要對瀏覽器、搜尋引擎crawl還有各類下載工具作出不同的響應。伺服器 就是通過所謂的User-agent進行區分的。
如果你的伺服器提供某些資源的下載,那麼你就必須多加小心諸如“迅雷”等下載軟體,因為它們可能把你網站資源吸幹,並且影響你的正常訪客訪問。為此,我們可以利用Rewrite限制某些UA的訪問:
RewriteEngine onRewriteCond %{HTTP_USER_AGENT} 2.0.50727 [NC]RewriteRule . abuse.txt [L]
該規則限制“迅雷”用戶端下載資源,並將下載檔案重設到abuse.txt
HTTP_USER_AGENT是Apache的內建變數
2.0.50727是迅雷User-agent的特徵字串
RewriteRule後面的“點”表示“任意URI”,也就是不管請求的是什麼,都輸出abuse.txt
通常,我們不會僅限制一個UA。利用[OR]即可實現對多個UA作出統一處理:
RewriteEngine onRewriteCond %{HTTP_USER_AGENT} 2.0.50727 [NC,OR]RewriteCond %{HTTP_USER_AGENT} ^BlackWidow [NC,OR]# etc..RewriteCond %{HTTP_USER_AGENT} ^Net\ Vampire [NC]RewriteRule . abuse.txt [L]
4.3 用.htaccess阻止盜鏈(hot-linking)
盜鏈,特別是圖片,是非常可恥的!哪怕將圖片複製到自己伺服器上,也比盜用他人的圖片連結來得光彩!(吐糟完畢)
.htaccess的Rewrite功能可以提供非常簡單、有效方法阻止這種可恥行為:
RewriteEngine OnRewriteCond %{HTTP_REFERER} !^$RewriteCond %{HTTP_REFERER} !^http://(www\.)?lesca\.me/ [NC]RewriteCond %{REQUEST_URI} !hotlink\.png [NC]RewriteRule .*\.(gif|jpg|png)$ /hotlink.png [NC]
簡單解釋一下該規則的功能:
- 除本站以外其他網站都不得引用本站圖片,具體可以理解為
- 如果引用網站為“空”或者是“本站”,或者,所引用對象是“hotlink.png”,那麼就允許訪問
- 再次提醒,RewriteCond之間預設的邏輯串連詞是邏輯“與”
- 這裡的痛點是理解邏輯轉換,即德·摩根定律
轉載請註明: http://www.cnblogs.com/ganiks/htaccessRegex
#位於行首時表示注釋。[F]Forbidden(禁止): 命令伺服器返回 403 Forbidden錯誤給使用者瀏覽器[L]Last rule(最後一條規則): 告訴伺服器在本條規則執行完後停止重寫URL[N]Next(下一條規則): 告訴伺服器繼續重寫,指導所有重寫指令都執行過[G]Gone(丟失): 命令伺服器返回410 GONE(no longer exists)錯誤訊息[P]Proxy(代理): 告訴伺服器通過mod_proxy模組處理使用者請求[C]Chain(捆綁): 告訴伺服器將當前的規則和前面的規則進行捆綁[R]Redirect(重新導向): 命令伺服器發出重新導向訊息,以便使用者瀏覽器發出rewritten/modified(重寫/修改)URL的請求[NC]No Case(不區分大小寫): 對用戶端請求的URL不區分大小寫[PT]Pass Through(允許存取): 讓mod_rewrite模組將重寫的URL傳回給Apache做進一步處理[OR]Or(邏輯或): 用邏輯“或”將兩個運算式串連在一起,如果結果為“真”,則會應用後繼的相關規則[NE]No Escape(禁用轉義): 命令伺服器在輸出時禁用逸出字元[NS]No Subrequest(禁用子請求): 如果存在內部子請求,則跳過當前命令[QSA]Append Query String(新增查詢字串): 命令伺服器在URL末尾新增查詢字串[S=x]Skip(跳過): 如果滿足某指定的條件,則跳過後面第x調規則[E=variable:value]Environmental Variable(環境變數): 命令伺服器將值value賦給變數variable[T=MIME-type]Mime Type(MIME類型): 聲明目標資源所屬的MIME類型[]匹配一個字元集合,例如[xyz]可以匹配x, y或者z[]+例如[xyz]+會以任何順序、次數匹配x,y,z的出現[^]字元^表示字元集的補集。[^xyz]將匹配沒有x,y或者z的字串[a-z]連字號(-)表示匹配從字母a到字母z的所有字串a{n}指定字母a出現的次數為n次,滿足該條件時匹配。例如x{3}僅與xxx匹配a{n,}指定字母a出現的次數至少為n次,例如x{3,}可以與xxx或者xxxx等匹配a{n,m}指定a出現的次數至少為n到m次。()用於將Regex分組,滿足第一組Regex的字串會被儲存在變數$1中,以此類推。如果括弧中的不是Regex,例如(perishable)?press 將能夠匹配有或者沒有perishable首碼的press^位於行首。注意:和中括弧中的[^]意義不同。$位於行末?例如 monzas? 會匹配 monza 或者 monzas,而 mon(za)? 會匹配 mon 或者 monza。又如 x? 會匹配“Null 字元” 或者 一個x!邏輯非。例如“!string” 將會匹配除了“string”以外的所有字串.表示任一字元串-命令Apache“不要”重寫URL,例如“xxx.domain.com.* – [F]”+匹配至少一個任一字元,例如G+匹配以G開頭、並且後面至少有一個字元的字串*匹配零個或多個字元,例如“.*”匹配任一字元串|邏輯“或”,與[OR]不同的是,它只匹配字串,例如(x|y)匹配x或者y逸出字元。可以轉義左括弧( 尖字元^ 貨幣符號$ 驚嘆號! 點. 星號* 管道符號| 右括弧) 等\.轉義為點字元(點字元在Regex中可以匹配任一字元)/*零個或多個正斜杠.*零個或多個任一字元(即,匹配任一字元串,包括Null 字元)^$匹配“Null 字元”、“空行”^.*$匹配任一字元串(僅限一行)[^/.]匹配既非“正斜杠”也不是“點”的任一字元[^/.]+匹配第一個字元既非“正斜杠”也不是“點”,後繼字元可以是“正斜杠”或者“點”的字串http://匹配“http://”^domain.*匹配以“domain”開始的字串^domain\.com$僅匹配“domain.com”-d測試字串是否是已存在的目錄-f測試字串是否是已存在的檔案-s測試字串所指檔案是否有“非零”值HTTP協議重新導向編碼301 – Moved Permanently302 – Moved Temporarily403 – Forbidden404 – Not Found410 – Gone
[PHP] htaccess 探秘