.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

相关文章
相关标签/搜索