.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 .php .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 .php 2.php [F]
[G] -- Gone 返回页面不存在,也就是返回410,即使页面存在的时候
和[F]一样,只会看前面的文件规则,后面匹配文件是什么无所谓
RewriteEngine On
RewriteBase /test/
RewriteCond %{HTTP_REFERER} ^127.0.0.1$ [NC]
RewriteRule .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 .php .php [L]
RewriteRule .php .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
.htaccess文件配置理解的更多相关文章
- 简单实用的.htaccess文件配置
.htaccess 文件 (Hypertext Access file) 是Apache Web服务器的一个非常强大的配置文件,对于这个文件,Apache有一堆参数可以让你配置出几乎随心所欲的功能.. ...
- 通过htaccess文件配置多个一级域名指向根目录的子文件夹
创建.htaccess文件,在Windows系统创建时要写成“.htaccess.”,不带双引号,否则不会创建成功. <IfModule mod_rewrite.c> Options +F ...
- apache配置rewrite及.htaccess文件(转载)
今天看到一个哥们的帖子发了个rewrite的帖子,以前也写过一个,配置挺简单的,但当时没注意这个问题,当时没有用到.htaccess文件,在机子上测试了一下,发现确实没法用,于是开始找问题的所在. 自 ...
- apache的 .htaccess文件的常用配置
使用.htaccess文件需要注意的地方: 1.找到配置文件httpd.conf,将override的值改成all.如下图:(如果不设置成all,apache将忽略.htaccess文件)
- apache .htaccess文件详解和配置技巧总结
一..htaccess的基本作用 .htaccess是一个纯文本文件,它里面存放着Apache服务器配置相关的指令. .htaccess主要的作用有:URL重写.自定义错误页面.MIME类 ...
- Apache通过配置.htaccess文件禁止访问.git、.svn等目录
如果你用过Git.SVN等代码版本控制工具的话,那肯定会知道,如果你需要拉去最新的代码到本地时,会自动生成一个.git或者.svn文件夹,里面包含一些项目相关的信息,如果在部署项目是,把这些文件公开暴 ...
- php ini_set更改php.ini配置,通过它修改php.in达到php上传文件大小限制是不行的,除非修改.htaccess文件
PHP ini_set() 无效的原因:如题:我租的是虚拟主机,php.ini里的upload_max_filesize是默认的2M,要直接修改php.ini文件是不可能的.我如果想上传超过2M的怎么 ...
- php配置伪静态如何将.htaccess文件转换 nginx伪静态文件
php通常设置伪静态三种情况,.htaccess文件,nginx伪静态文件,Web.Config文件得形式,如何将三种伪静态应用到项目中呢, 1,.htaccess文件 实例 <IfModule ...
- .htaccess文件的详解以及404页面的设置
打开记事本,写入以下代码: ErrorDocument 404 /404.html保存成.htaccess文件上传到网站的根目录. /404.html是目录名和文件名,可以改成自己的名字.QUOTE: ...
随机推荐
- JMockit学习笔记
一.在eclipse下建立JMockit工程 1.下载最新版JMockit(jmockit-1.4.zip): 2.解压后的文件夹包含有:library jars, source files, sam ...
- 201871010111-刘佳华《面向对象程序设计(java)》第四周学习总结
201871010111-刘佳华<面向对象程序设计(java)>第四周学习总结 实验时间 2019-9-20 第一部分:总结第四章理论知识 4.1:类与对象的概念. 类:类是构造对象的模板 ...
- C#基础表达式语句详解(下)
书接上文: 4.选择语句:if语句和switch语句 4.1If语句:statement:两种格式:A与B A:If(boolean-expression)embedded-statement(嵌入式 ...
- woocommerce调用分类描述另一种方法
woocommerce是在wordpress基础上开发的,有些函数是通用的,有些需要自己调用,比如文章分类用category_description()就可以调用,而woocommerce的产品分类描 ...
- Vue小练习(for循环,push方法,冒泡,if判断(以及与for循环的连用),按钮高亮,根据input框筛选数据)
vue练习 ''' 1. 先有一下成绩单数据 scores = [ { name: 'Bob', math: 97, chinese: 89, english: 67 }, { name: 'Tom' ...
- 微信小程序 - 结构目录 | 配置介绍
结构目录 小程序框架提供了自己的视图层描述语言 WXML 和 WXSS,以及 JavaScript,并在视图层与逻辑层间提供了数据传输和事件系统,让开发者能够专注于数据与逻辑. 一.小程序文件结构和传 ...
- HTML中,input元素的 Disabled属性 所产生的后端无法接收数据的问题
背景 今天从前端提交 form表单 数据时,发现 设置 Disabled 的 input 元素的字段数据在后端无法接收到 原因 查阅资料(来自W3school): disabled 属性规定应该禁用 ...
- wal2json java jdbc 试用
上边有介绍过使用命令行模式的wal2json扩展使用,以下是一个jdbc 集成的试用(pg jdbc 驱动天然支持复制) 环境准备 pg(包含wal2json扩展)docker-compose 文件 ...
- CF1217E Sum Queries? (线段树)
完了,前几天才说 edu 的 DEF 都不会,现在打脸了吧 qwq 其实在刚说完这句话 1min 就会了 D,3min 就会了 E 发现,对于大小 \(\ge 3\) 的不平衡集合,它至少有一个大小为 ...
- Elasticsearch由浅入深(八)搜索引擎:mapping、精确匹配与全文搜索、分词器、mapping总结
下面先简单描述一下mapping是什么? 自动或手动为index中的type建立的一种数据结构和相关配置,简称为mappingdynamic mapping,自动为我们建立index,创建type,以 ...