[PHP] htaccess 探秘

來源:互聯網
上載者:User

標籤: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>

注意事項:

  • 該RewriteRule能夠將.htm靜態頁面重新導向到.php動態網頁面
  • 如果通過.htm進入,瀏覽器地址欄會自動轉為.php,這也是重新導向的本質
  • 必須保證伺服器上有對應的.php,否則會404
  • 瀏覽器和搜尋引擎可以同時通過.htm和.php訪問網頁
  • 如果該目錄上存在.htm,將被忽略
  • RewriteBase定義了重寫基準目錄。

    • 例如,如果你將虛擬網站設定在/var/www目錄下,刪除這行將會導致重新導向到http://yourdomain.com/var/www/1.php。顯然這是找不到的,而且你也不會希望使用者看見你的伺服器的目錄結構。
  • 再舉個例子,如果RewriteBase /base/,那麼將會重新導向到http://yourdomain.com/base/1.php。
  • 對於重寫基準目錄,我們還可以通過將$1.php變成/$1.php實現直接變換,這時就可以將RewriteBase省略。
  • 字母R表示臨時重新導向,相當於[R=302,NC]。關於重新導向代碼,請參考本站《HTTP協議重新導向編碼》
  • 字母L表示如果能匹配本條規則,那麼本條規則是最後一條(Last),忽略之後的規則。

<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. 利用 RewriteCondRewriteRule進行存取控制

我們在第一篇.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 探秘

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.