.htaccess文件配置理解

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

http://www.javashuo.com/article/p-sytzupmw-cr.html

https://blog.csdn.net/phptyong/article/details/79943260

相關文章
相關標籤/搜索