zoukankan      html  css  js  c++  java
  • .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

  • 相关阅读:
    UVA 10617 Again Palindrome
    UVA 10154 Weights and Measures
    UVA 10201 Adventures in Moving Part IV
    UVA 10313 Pay the Price
    UVA 10271 Chopsticks
    Restore DB後設置指引 for maximo
    每行SQL語句加go換行
    种服务器角色所拥有的权限
    Framework X support IPV6?
    模擬DeadLock
  • 原文地址:https://www.cnblogs.com/sijidou/p/10856450.html
Copyright © 2011-2022 走看看