• .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被访问

    <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结语

    参考

    https://www.cnblogs.com/wumingcong/p/5044713.html

    https://www.cnblogs.com/kenshinobiy/p/5040337.html

    https://c7sky.com/htaccess-guide.html

    https://www.cnblogs.com/xiaorenwu702/p/6114623.html

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

  • 相关阅读:
    pamamiko的学习笔记
    pamamiko的安装
    python基本语法1.1--十进制与十六进制数之间的相互转换
    mnist深入--用卷积神经网络改善mnist
    minst数据集怎么跑
    七大常见排序算法总结(Java语言)
    ubuntu 16.03 Anaconda Tensorflow(CPU)安装
    IntelliJ Idea 2017 免费激活方法
    Ubuntu下安装deb格式的软件
    win10下配置java环境
  • 原文地址:https://www.cnblogs.com/sijidou/p/10856450.html
Copyright © 2020-2023  润新知