0x00前言
.htaccess文件是用於apache服務器下的控制文件訪問的配置文件,所以Nginx下是不會生效的php
.htaccess能夠控制錯誤重定向,初始頁面設置,文件夾的訪問權限,文件的跳轉等html
Nginx若是直接訪問,能夠下載該文件。若是是apache的話,正常狀況下該文件是不可被訪問的,可是能夠經過php的include之類的文件包含函數進行內容訪問linux
其實最好不要用.htaccess文件,由於目錄多了後,每一個目錄都有個.htaccess很難管理。可是最近在審計相似thinkphp框架的時候遇到了這個配置文件,因此學習記錄一下用法web
0x01環境準備正則表達式
我是windows下的phpstudy搭的環境,使用的是apache服務器選項,實例目錄以下thinkphp
特別注意.htaccess文件在windows下無法直接命名,我這裏是複製別人項目裏面有的.htaccess,固然linux下就沒有這種限制apache
0x02設置文件訪問權限windows
咱們能夠在.htaccess中使用如下代碼拒絕1.php被訪問php框架
<Files 1.php> order allow,deny deny from all </Files>
若是要容許訪問,那麼把deny from all 改成allow from all便可服務器
那麼若是要禁止某個ip訪問該文件,好比我如今有臺虛擬機的網卡信息以下
個人本機的ip是10.10.10.1
那麼文件的過濾規則以下
<Files 1.php> order allow,deny deny from 10.10.10.128 </Files>
虛擬機不可訪問頁面
可是此時會發現本地也沒法訪問頁面,所以還要對.htaccess文件進行修改
<Files 1.php> order allow,deny deny from 10.10.10.128 allow from all </Files>
能夠看出這個訪問控制(ACL)的寫法和路由器的ACL寫法同樣
可是若是把上面的deny和allow順序進行交換,仍是10.10.10.128仍是沒法訪問,所以和路由器配置的ACL仍是稍微有點區別
限制ip對整個文件夾的訪問權限
order allow,deny
allow from all
deny from 10.10.10.128
和上面限制某個文件相比少了個<Files>的標籤,其餘方法同樣的
文件名規則還支持正則表達式,開啓正則表達式要用~,好比全部的php文件都限制10.10.10.128的訪問
<Files ~ "^.*\.php$"> order allow,deny allow from all deny from 10.10.10.128 </Files>
~與"直接有個空格,否則不會生效
也能夠支持通配符,好比
<Files *.php> order allow,deny allow from all deny from 10.10.10.128 </Files>
0x03錯誤重定向&重定向
這裏我假設404的時候顯示2.php頁面
ErrorDocument 404 /test/2.php
注意這裏有個坑,重定向的頁面的路徑是對於web站點的根目錄的路徑,由於個人代碼是在test文件夾下,可是它起始的路徑是WWW路徑下
普通的重定向,假設我要訪問1.php,要將訪問1.php的請求重定向到2.php,寫法以下,這個路徑規則和上面錯誤重定向同樣
Redirect /test/1.php /test/2.php
0x04 設置初始頁面
有時候沒有index.html或者index.php頁面,這裏我使用1.php做爲初始頁面的話,寫法以下,這個路徑規則就是從當前文件夾路徑開始的了
DirectoryIndex 1.php
0x05 RewriteEngine
RewriteEngine語法不少,這個功能的做用能夠防止圖片盜鏈(也就是你服務器上的圖片,能夠設置其餘站點不能使用圖片的url掛在他們的頁面上),也能夠配置重定向,還有不少能夠作到的事
開啓這個功能須要一行代碼
RewriteEngine On
若是在這以後想要關閉,可使用下面的代碼
RewriteEngine Off
這個功能具有幾個比較重要的關鍵字,他們是
RewriteEngine On|Off #設置功能的開啓與關閉 RewiteBase var1 #設置功能的路徑,這一步是設置範圍,var1是路徑,基於url的,也就是根目錄(不是當前目錄) RewriteCond var1 var2 [flag] #設置功能的匹配的條件,這一步是判斷,var1是傳入的字符串,var2是待匹配的字符串,[flag]是標誌 RewriteRule var1 var2 [flag] #設置功能的重寫規則,這一步是執行,var1是改變前的樣子,var2是改變後的樣子,[flag]是標誌
RewriteCond的var2和RewriteRule的var1是支持正則的
其中RewriteCond能夠傳入系統變量好比 HTTP_REFERER 等,詳細有哪些能夠用php把$_SERVER全局變量給遍歷一遍看看
RewriteCond能夠理解成if的嵌套,由於能夠寫多個RewriteCond,也就是要知足全部的RewriteCond纔會執行以後的RewriteRule
[flag]的用法,和舉例
由於RewriteCond是能夠加[flag]的,可是我手動fuzz了下,發現只有[NC]可以使用,其餘的標籤若是被設置,服務器會返回500報錯,接下來就主要以RewriteRule中的[flag]用法講解
默認不加會把var1的文件解析成var2的文件,能夠組合使用好比[R,L]表示又有[R]標籤又有[L]標籤
[R] -- Redirect 重定向跳轉,加了該標籤會從知足var1的頁面跳轉到var2的頁面
RewriteEngine On RewriteBase /test/ RewriteCond %{HTTP_REFERER} ^127.0.0.1$ RewriteRule 1.php 2.php [R]
這段的意思是若是referer頭是127.0.0.1的話,就會跳轉到2.php,[R]表示重定向的302,效果以下
[F] -- Forbidden 對頁面的禁止訪問
其實有這個[flag], 後面一個匹配文件叫什麼都無所謂了,可是必需要寫
RewriteEngine On RewriteBase /test/ RewriteCond %{HTTP_REFERER} ^127.0.0.1$ [NC] RewriteRule 1.php 2.php [F]
[G] -- Gone 返回頁面不存在,也就是返回410,即便頁面存在的時候
和[F]同樣,只會看前面的文件規則,後面匹配文件是什麼無所謂
RewriteEngine On RewriteBase /test/ RewriteCond %{HTTP_REFERER} ^127.0.0.1$ [NC] RewriteRule 1.php 2.php [G]
[P] -- Proxy 告訴服務器經過mod_proxy模塊處理用戶請求
這個應該是若是服務器又代理設置的話,加上這個[flag]能夠走代理去訪問第一個參數文件,同理第二個文件內容不用在乎
[L] -- Last rule 最後條規則
我測試時默認狀況加了[L]其實和跳轉[R]做用同樣,可是不是302,是直接之後面的文件解析,[L]以後的規則不會被執行
RewriteEngine On RewriteBase /test/ RewriteCond %{HTTP_REFERER} ^127.0.0.1$ [NC] RewriteRule 1.php 1.php [L] RewriteRule 1.php 2.php [R]
若是不加[L],那麼會返回302,可是加了[L],任然返回1.php的內容
[N] -- Next 重寫
也就是從第一個RewriteRule再次執行,由於如今的環境(只有1.php和2.php)設計不出很複雜的應用,這裏也就不直接舉例了,至關於循環同樣
[C] -- Chain 將當前的規則和後規則組合起來
道理都懂,侷限於本身的認知,不太清楚具體使用orz
[T] -- Type-MIME 聲明目標資源所屬的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]
這段話是學習某篇博客的,可是我本地多是環境的文件並無回顯源碼
如下的使用的條件比較複雜,以後再研究,這裏羅列一下
[NC] --Nocase 對url的輸入忽略大小寫
[NS] -- Nosubreq 沒有內部子請求時運行,也就是適用於cgi
[QAS] -- Qsappend 在新的url後追加內容
[PT] -- Passthrough 將url傳給下一個apache模塊進行處理
[S] -- Skip 忽略以後的規則
[E] -- Env 設置環境變量
0xff結語
參考
http://www.javashuo.com/article/p-ehztlaeu-hh.html
http://www.javashuo.com/article/p-myvcffrz-cx.html
https://c7sky.com/htaccess-guide.html