apache的.htaccess文件作用和相关配置
首先.htaccess什么?
.htaccess是一个纯文本文件,它里面存放着Apache服务器配置相关的指令。
当我们使用apache部署一个网站代码准备部署到网上的时候,我们手中的apache的httpd.conf大家肯定都知道。这是apache的配置文件,然而我们大多数的网站都是基于云服务器来部署的,还有就是团队协作开发的时候,我们很难直接修改公共的httpd.conf,这时 .htaccess就是httpd.conf的衍生品,它起着和httpd.conf相同的作用。
.htaccess的基本作用
- URL重写、自定义错误页面
- MIME类型配置
- 访问权限控制等
- 主要体现在伪静态的应用
- 图片防盗链
- 自定义404错误页面
- 阻止/允许特定IP/IP段
- 目录浏览与主页
- 禁止访问指定文件类型
- 文件密码保护
如何启用呢
首先我们找到httpd.conf,查找AllowOverride。启用AllowOverride
这个作用是允许重写覆盖相关配置

再打开mod_rewrite机制,即还是在.httpd.conf中查找mod_rewrite.so
这个作用是在httpd.conf外重写配置

先给个福利
这里分享给大家一个自动生成.htaccess的网站,懒人必备哦
我们接下来接着分析相关功能
自定义错误页面
写法:ErrorDocument 错误代码 空格 /目录名/文件名.扩展名
例子:
- ErrorDocument 404 /404.html
- ErrorDocument 500 /500.htm
这样写好后保存后,重启apache(一旦修改就一定要重启apache,后文不再赘述),我们发现对应的错误代码显示的页面即是我们指定的文件,很好理解
URL重写
这个功能是.htaccess很强大的功能,试想我们做好的web一般都不想让用户多输入url吧,还有就是什么.php.asp.do统统去掉才好.
首先把这个功能打开
# 将 RewriteEngine模式打开
RewriteEngine On
我们先截取一段thinkphp中的默认隐去.php的.htaccess
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
第一眼看上去,这都什么鬼,之前还同学问我这段代码就是这样吗?
额,是的,absulotly~我们慢慢分析下
首先这里面有两个基本的命令: RewriteCond和 RewriteRule
RewriteCond Syntax: RewriteCond TestString CondPattern [flags]
- TestString是一个纯文本的字符串,除了包含普通的字符外 ,还可以包含
1.RewriteMap扩展:引用方法是:${mapname:key|default}
2.TestString可以包含服务器变量 ,引用方法是:%{val}
其中val(变量)可以是

这里我们列举出一些常用的val:
REQUEST_FILENAME
这是与请求相匹配的完整的本地文件系统的文件路径名。
HTTPS
如果连接使用了SSL/TLS,它将包含字符串”on”,否则就是”off”(无论mod_ssl 是否已经加载,该变量都可以安全的使用)。
REQUEST_URI
这是在HTTP请求行中所请求的资源.
其实有些val和PHP中的许多变量是相同的,比如:
RewriteCond %{HTTP_USER_AGENT} ^Mozilla//5/.0.*
RewriteRule index.php index1php
RewriteCond %{HTTP_USER_AGENT} ^Lynx.*
RewriteRule index.php index2.php
RewriteRule index.php index3.php
也就相当于PHP
<?php
if($_SERVER['HTTP_USER_AGENT'] == 'Mozilla/5.0')
{
header("Location:1.php");
}
else if($_SERVER['HTTP_USER_AGENT'] == 'Lynx')
{
header("Location:2.php");
}
else
header("Location:3.php");
?>
CondPattern是条件模式,即一个应用于当前TestString实例的正则表达式,这个正则表达式是和perl通用的。
但还有不同于不同正则的
1、可以在CondPattern串的开头使用”!’(惊叹号)来指定 不匹配 。
2、CondPatterns有若干特殊的变种。 除了正则表达式的标准用法,还有下列用法:
将CondPattern视为纯字符串,与TestString按词典顺序进行比较。 如果TestString小于CondPattern则为真。
“>CondPattern”————-(词典顺序的大于)
将CondPattern视为纯字符串,与TestString按词典顺序进行比较。 如果TestString大于CondPattern则为真。
“=CondPattern”————-(词典顺序的等于)
将CondPattern视为纯字符串,与TestString按词典顺序进行比较。 如果TestString等于CondPattern(两个字符串逐个字符地完全相等)则为真。
如果CondPattern是”"—(两个双引号),则TestString将与空字符串进行比较。
“-d”————-(目录)
将TestString视为一个路径名并测试它是否为一个存在的目录。
“-f “————-(常规文件)
将TestString视为一个路径名并测试它是否为一个存在的常规文件。
“-s “————-(非空的常规文件)
将TestString视为一个路径名并测试它是否为一个存在的、尺寸大于0的常规文件。
“-l “————-(符号连接)
将TestString视为一个路径名并测试它是否为一个存在的符号连接。
“-x “————-(可执行)
将TestString视为一个路径名并测试它是否为一个存在的、具有可执行权限的文件。 该权限由操作系统检测。
“-F “————-(对子请求存在的文件)
检查TestString是否为一个有效的文件,而且可以在服务器当前的访问控制配置下被访问。
“-U “————-(对子请求存在的URL)
[flags]
作为RewriteCond指令的第三个参数。flags是一个以逗号分隔的以下标记的列表。

RewriteRule
RewriteRule Syntax: Pattern rewritePattern [flags]
- Pattern就是正则,如php。
- rewritePattern 是针对Pattern 匹配后的URL进行rewritePattern 规定的替换。应用替换时,前面Pattern 第一个()中匹配的内容后面rewritePattern 就可以用$1引用,第二个()中匹配的就用$2应用……以此类推。
- flags和上面的RewriteCond一致,这里不再赘述啦~
而我们的例子中的三行就是
- RewriteCond %{REQUEST_FILENAME} !-f
#如果文件存在,就直接访问文件,不进行下面的RewriteRule.(不是文件或文件不存在就执行重写) - RewriteCond %{REQUEST_FILENAME} !-d
#如果目录存在就直接访问目录不进行RewriteRule
RewriteRule ^(.)$ index.php/$1 [QSA,PT,L]
#对于所有的( ^(.) )加上 “index.php/” 拼接为index.php/XXX( ^(.*) ),
追加请求串(QSA)移交给下一个处理器 pass through(PT(可不是代理为MIME类型,PT是一个flage)),而且这是 last最后的rules(L)的 。
好长的一串,这回有点懂了吧。我们继续吧~
阻止/允许特定的IP地址
- deny from 127.0.0.1 #阻止这个ip
- allow from 192.168.0.1#允许这个ip
- deny 202.200.*.* #阻止所有202.200开头的ip
这个也比较好理解。
通过.htaccess放盗链
RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www\.)?mydomain(/)?.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://(www\.)?baidu(/)?.*$ [NC]
RewriteRule .*\.(gif|jpg|jpeg|bmp|png)$ http://mydomain/404.html [R,NC,L]
这个呢,和之前的一样,把除了mydomain和baidu域名的请求图片都冲定位到404.html.这就起到了防盗链的需求。
重定向
- Redirect permanent index.php home.php #永久重定向
- Redirect temp index.php home.php #临时重定向
关于临时和永久的重定向就是302和301
我们摘抄出来一段话
(1)301 redirect——301代表永久性转移(Permanently Moved),301重定向是网页更改地址后对搜索引擎友好的最好方法,只要不是暂时搬移的情况,都建议使用301来做转址。
(SEO(搜索引擎优化)中提到一点:如果我们把一个地址采用301跳转方式跳转的话,搜索引擎会把老地址的PageRank等信息带到新地址,同时在搜索引擎索引库中彻底废弃掉原先的老地址。)
(2)302 redirect——302代表暂时性转移(Temporarily Moved ),在前些年,不少Black Hat SEO曾广泛应用这项技术作弊,目前,各大主要搜索引擎均加强了打击力度,象Google前些年对Business.com以及近来对BMW德国网站的惩罚。即使网站客观上不是spam,也很容易被搜寻引擎容易误判为spam而遭到惩罚。
(3)meta fresh——这在2000年前比较流行,不过现在已很少见。其具体是通过网页中的meta指令,在特定时间后重定向到新的网页,如果延迟的时间太短(约5秒之內),会被判断为spam。
apache的.htaccess文件作用和相关配置的更多相关文章
- mac下为Apache 创建 .htaccess文件
标签:mac .htaccess 在设置固定链接时会提示如下的问题: 若您的 .htaccess 文件可写,我们可以自动修改它.但似乎它不可写,因此我们在下方列出了您 .htaccess 文件 ...
- apache .htaccess文件详解和配置技巧总结
一..htaccess的基本作用 .htaccess是一个纯文本文件,它里面存放着Apache服务器配置相关的指令. .htaccess主要的作用有:URL重写.自定义错误页面.MIME类 ...
- apache的 .htaccess文件的常用配置
使用.htaccess文件需要注意的地方: 1.找到配置文件httpd.conf,将override的值改成all.如下图:(如果不设置成all,apache将忽略.htaccess文件)
- Java Web的web.xml文件作用及基本配置(转)
其实web.xml就是asp.net的web.config一个道理. 说明: 一个web中完全可以没有web.xml文件,也就是说,web.xml文件并不是web工程必须的. web.xml文件是用来 ...
- 【转载】Java Web的web.xml文件作用及基本配置
其实web.xml就是asp.net的web.config一个道理. 说明: 一个web中完全可以没有web.xml文件,也就是说,web.xml文件并不是web工程必须的. web.xml文件是用来 ...
- Apache 中 .htaccess 文件设置技巧16则
.htaccess 文件 (Hypertext Access file) 是Apache Web服务器的一个非常强大的配置文件,对于这个文件,Apache有一堆参数可以让你配置出几乎随心所欲的功能.. ...
- 让apache支持htaccess文件
第一:检测 apache是否开启mod_rewrite 通过php提供的phpinfo()函数查看环境配置,在"apache2handler -> Loaded Modules&quo ...
- PHP框架中.htaccess文件作用
1..htaccess文件使用前提 .htaccess的主要作用就是实现url改写,也就是当浏览器通过url访问到服务器某个文件夹时,作为主人,我们可以来接待这个url,具体地怎样接待它,就是此文件的 ...
- WebService文件上传相关配置(404.13、超出限制、超时)
最近在做文件上传的功能,遇到一些问题,记录如下,以备以后使用. 1.HTTP Error 404.13 - Not Found,请求筛选模块被配置为拒绝超过请求内容长度的请求. IIS默认允许请求长度 ...
随机推荐
- 常见cmd命令,开发人员必备
运行程序 notepad--------打开记事本 calc-----------启动计算器 regedit.exe-------注册表 write----------写字板 mmc--------- ...
- redis hashmap数据结构分析
说明一点:redis的hash中每一个key都是一个单独的hash表,field是hash表中的key,value是hash表中的value: //redis中hash数据结构为:key-field- ...
- 发现一个好工具RenderDoc
逛VULKAN官网时,工具中提到RenderDoc这个东西,百度了下,是专为图形程序员用的,可以集成到VS,或U3D中,收藏先. 参考链接
- mysql--构造数据、导入导出
一.mysql造数据脚本 DELIMITER $$ DROP PROCEDURE IF EXISTS `test3`$$ CREATE /*[DEFINER = { user | CU ...
- Druid中配置双数据库
配置如下 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://w ...
- Maven下Spring + SpringMvc + Hibernate4 配置实例
1. 开发环境 IDEA 2. 在pom.xml中配置引用相关的包. <properties> <junit.version>4.10</junit.version> ...
- CAS 无锁队列
队列是常用的数据结构,采用的FIFO(first in firstout)原则,新元素(等待进入队列的元素)总是被插入到尾部,而读取的时候总是从头部开始读取.在计算中队列一般用来做排队(如线程池的等待 ...
- 今天遇到一个怪异的问题,maven生成项目war包中有一个Jar包不是我指定的版本,运行时会找不到符号,o(╥﹏╥)o
我要求的jar包: 这是我parent项目中pom文件的依赖管理 这是我要生成war包那个工程最后依赖的jar包,这个时候它们的版本号还是一致的 最后项目生成的: 下图是Dmaven.test.ski ...
- flask中缓存cache导入时引发的错误
安装 pip install flask-cache 初始化 from flask_cache import Cache cache = Cache(config={ 'CACHE_TYPE': 's ...
- 【笔记】Python基础六:模块module介绍及常用模块
一,module模块和包的介绍 1,在Python中,一个.py文件就称之为一个模块(Module). 2,使用模块的好处? 最大的好处是大大提高了代码的可维护性 其次,编写代码不必从零开始,我们编写 ...