.htaccess ⽂件配置理解
0x00前⾔
.htaccess⽂件是⽤于apache服务器下的控制⽂件访问的配置⽂件,因此Nginx下是不会⽣效的
.htaccess可以控制错误重定向,初始页⾯设置,⽂件夹的访问权限,⽂件的跳转等
Nginx如果直接访问,可以下载该⽂件。如果是apache的话,正常情况下该⽂件是不可被访问的,但是可以通过php的include之类的⽂件包含函数进⾏内容访问
其实最好不要⽤.htaccess⽂件,因为⽬录多了后,每个⽬录都有个.htaccess很难管理。但是最近在审计类似thinkphp框架的时候遇到了这个配置⽂件,所以学习记录⼀下⽤法
0x01环境准备
我是windows下的phpstudy搭的环境,使⽤的是apache服务器选项,实例⽬录如下
特别注意.htaccess⽂件在windows下没法直接命名,我这⾥是复制别⼈项⽬⾥⾯有的.htaccess,当然linux下就没有这种限制
0x02设置⽂件访问权限
我们可以在.htaccess中使⽤以下代码拒绝1.php被访问
如果要允许访问,那么把deny from all 改为allow from all即可
那么如果要禁⽌某个ip访问该⽂件,⽐如我现在有台虚拟机的⽹卡信息如下
我的本机的ip是10.10.10.1
那么⽂件的过滤规则如下
虚拟机不可访问页⾯
<Files 1.php >
order allow,deny
deny from all
</Files >
<Files 1.php >
order allow,deny
deny from 10.10.10.128
正则匹配到第一个关键字就停止</Files >
但是此时会发现本地也⽆法访问页⾯,因此还要对.htaccess⽂件进⾏修改
可以看出这个访问控制(ACL)的写法和路由器的ACL写法⼀样
但是如果把上⾯的deny和allow顺序进⾏交换,还是10.10.10.128还是⽆法访问,因此和路由器配置的ACL还是稍微有点区别
限制ip对整个⽂件夹的访问权限
和上⾯限制某个⽂件相⽐少了个<Files>的标签,其他⽅法⼀样的
⽂件名规则还⽀持正则表达式,开启正则表达式要⽤~,⽐如所有的php⽂件都限制10.10.10.128的访问
~与"直接有个空格,不然不会⽣效
也可以⽀持通配符,⽐如
0x03错误重定向&重定向
这⾥我假设404的时候显⽰2.php页⾯
注意这⾥有个坑,重定向的页⾯的路径是对于web站点的根⽬录的路径,因为我的代码是在test⽂件夹下,但是它起始的路径是WWW路径下
普通的重定向,假设我要访问1.php,要将访问1.php的请求重定向到2.php,写法如下,这个路径规则和上⾯错误重定向⼀样
<Files 1.php >
order allow,deny
deny from 10.10.10.128
allow from all
</Files >
order allow,deny
allow from all
deny from 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 >
ErrorDocument 404 /test/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], 后⾯⼀个匹配⽂件叫什么都⽆所谓了,但是必须要写
[G] -- Gone 返回页⾯不存在,也就是返回410,即使页⾯存在的时候
和[F]⼀样,只会看前⾯的⽂件规则,后⾯匹配⽂件是什么⽆所谓
[P] -- Proxy 告诉服务器通过mod_proxy模块处理⽤户请求
这个应该是如果服务器⼜代理设置的话,加上这个[flag]可以⾛代理去访问第⼀个参数⽂件,同理第⼆个⽂件内容不⽤在意
[L] -- Last rule 最后条规则
我测试时默认情况加了[L]其实和跳转[R]作⽤⼀样,但是不是302,是直接以后⾯的⽂件解析,[L]之后的规则不会被执⾏
如果不加[L],那么会返回302,但是加了[L],任然返回1.php的内容
RewriteEngine On
RewriteBase /test/
RewriteCond %{HTTP_REFERER} ^127.0.0.1$ [NC]
RewriteRule 1.php 2.php [F]
RewriteEngine On
RewriteBase /test/
RewriteCond %{HTTP_REFERER} ^127.0.0.1$ [NC]
RewriteRule 1.php 2.php [G]
RewriteEngine On
RewriteBase /test/
RewriteCond %{HTTP_REFERER} ^127.0.0.1$ [NC]
RewriteRule 1.php 1.php [L]
RewriteRule 1.php 2.php [R]
[N] -- Next 重写
也就是从第⼀个RewriteRule再次执⾏,因为现在的环境(只有1.php和2.php)设计不出很复杂的应⽤,这⾥也就不直接举例了,相当于循环⼀样
[C] -- Chain 将当前的规则和后规则组合起来
道理都懂,局限于⾃⼰的认知,不太清楚具体使⽤orz
[T] -- Type-MIME 声明⽬标资源所属的MIME类型
强制⽬标⽂件的MIME类型为MIME-type,可以⽤来基于某些特定条件强制设置内容类型。⽐如,下⾯的指令可以让.⽂件在以.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结语
参考
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论