htaccess文件配置说明-(持续更新中)
简介:
htaccess是apache的配置文件,可以实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表等功能。
启用.htaccess,需要修改httpd.conf,启用AllowOverride。同时.htaccess与httpd.conf配置文件不同的是,它只作用于当前目录。另外httpd.conf只是在Apache服务启动的时
候就加载的,而.htaccess只要有用户访问目录时加载,开销大、速度慢。
既然如此,为什么我们还要用.htaccess呢?因为它配置起来简单,它还支持重定向、URL重写以及访问验证,另外它管理起来很方便,可以很好适应网站迁移。总之,各有优缺点,主要就看你是要从全局考虑还是只配置单个目录。下面来看看一些常用的配置的一些说明:
“RewriteEngine On”,开启 Rewrite 规则开关;
“RewriteCond”指重写的条件
RewriteCond %{REQUEST_FILENAME} !-f 如果不是文件继续执行下面的RewriteRule(理解为:如果文件存在,就直接访问文件,不进行下面的RewriteRule)
RewriteCond %{REQUEST_FILENAME} !-d 如果不是目录继续执行下面的RewriteRule(理解为:如果目录存在就直接访问目录不进行RewriteRule)
“RewriteRule”,定义一条重写规则,后面的字符串通过正则表达式进行匹配,匹配字符串以 ^ 开头并以 $ 结尾,替换字符串中 $1 指被第一次被匹配成功的字符串
%{HTTP_REFERER} 指获取当前访问请求的来源网址
常用配置:
1)、阻止通过读取和写入 .htaceess 来更改服务器安全性的设置
<files .htaccess> order allow,deny deny from all </files>
2)、限制文件上传大小(这个能够帮助阻止 DoS 攻击(用户通过上传巨大的文件来冲垮服务器)并且能够节约带宽。)
# limit file uploads to 10mb LimitRequestBody 10240000
3)、自定义错误页面
ErrorDocument 404 /notfound.php ErrorDocument 403 /forbidden.php ErrorDocument 500 /error.php
4)、禁止访问目录
# disable directory browsing
Options All -Indexes
5)、图片防盗链(当有人试着直接链接到你的网站上图片,下面的代码将会使其显示 stealingisbad.gif
这张图片。)
RewriteEngine on RewriteCond %{HTTP_REFERER} !^$ RewriteCond %{HTTP_REFERER} !^http://(www\.)?yourdomain.com/.*$ [NC] (NC表示不区分大小写) RewriteRule \.(gif|jpg|png)$ http://www.yourdomain.com/stealingisbad.gif [R,L] (R表示跳转,L表示最后一条重写规则)
#注释:如果请求地址不为空,或者不是www.yourdomain.com、yourdomain.com的 后缀为git|jpg|png的,转到stealingisbad.gi
6)、顶级域名重定向到二级域名上(优化和提高网站搜索排名)
RewriteEngine On RewriteCond %{HTTP_HOST} ^yourdomain\.com$ [NC] RewriteRule ^(.*)$ http://www.yourdomain.com/$1 [R=301,L]
附加:
rewrite重写时,带参数:
RewriteRule 不会去匹配?后面的参数,需要用RewiteCond 来匹配
例如:把 /abc?id=123 重定向到 /def.php?id=123 的写法:
方式一:
RewriteEngine on RewriteBase / RewriteCond %{QUERY_STRING} ^id=(.+)$ RewriteRule ^/abc$ /def.php?sid=%1 [L]
#注释1:RewriteCond %{QUERY_STRING} ^id=(.+)$ ,得到url中的变量,并通过“%N”的方式获取(参数名可以重写,而且参数值可以匹配)
#注释2:RewriteCond 里面需要提取的值可以用 %N 进行反向引用值,而RewriteRule里面还是需要用$N的来反向引用值
如果 http://127.0.0.1/rewrite/jeecn.zdz?par=helloforbworld 中的 query_string包含字符串forb ,则禁止访问
RewriteCond %{QUERY_STRING} forb
RewriteRule ^(.*)\.(.*)$ preg.php?%{QUERY_STRING} [F]
eg.2
通过[QSA]标志保留原有URL参数的同时,在后面增加新的URL参数:param=value
RewriteRule ^/page /page?param=value [QSA]
eg3.
当URL参数包含字符串parm时
将URL:http://jeecn.com/ask?param=value 重写为: http://jeecn.com/answer?param=value
RewriteCond %{QUERY_STRING} parm
RewriteRule ^/ask /answer
eg4.%n反向引用
1)当访问 /path 时,将字符串 parm修改为 showparm
RewriteCond %{QUERY_STRING} ^(.*)parm(.*)$ RewriteRule /path /path?%1showparm%2
上面的%1和%2是反向引用,来自之前的RewriteCond中正则表达式的匹配结果
2)将http://jeecn.com/path?key=value 转换为: http://jeecn.com/path/key/value
RewriteCond %{QUERY_STRING} ^(\w+)=(\w+)$ RewriteRule ^/path /path/%1/%2?
方式二:
RewriteEngine on RewriteBase / RewriteRule ^/abc$ /def.php [L,QSA]
#注释1:[QSA]表示保留重写url时“?”后面的参数(但参数名不可以重写,只会原样的保留)
正则(这里只列出部分的,其他的正则遵循正则表达式):
RewriteCond语法参数:
# 位于行首时表示注释。
-d 测试字符串是否是已存在的目录
-f 测试字符串是否是已存在的文件
-s 测试字符串所指文件是否有"非零"值(非空的常规文件)
-l视为一个路径名并测试它是否为一个存在的符号连接(符号连接)
-x(可执行)视为一个路径名并测试它是否为一个存在的、具有可执行权限的文件。该权限由操作系统检测
RewriteRule语法参数:
[F] Forbidden(禁止) : 命令服务器返回 403 Forbidden错误给用户浏览器
[L] Last rule(最后一条规则) : 告诉服务器在本条规则执行完后停止重写URL
[N] Next(下一条规则) : 告诉服务器继续重写,指导所有重写指令都执行过
[G] Gone(丢失) : 命令服务器返回410 GONE(no longer exists)错误消息
[P] Proxy(代理) : 告诉服务器通过mod_proxy模块处理用户请求
[C] Chain(捆绑) : 告诉服务器将当前的规则和前面的规则进行捆绑
[R] Redirect(重定向) : 命令服务器发出重定向消息,以便用户浏览器发出rewritten/modified(重写/修改)URL的请求
[NC] No Case(不区分大小写) : 对客户端请求的URL不区分大小写
[PT] Pass Through(放行) : 让mod_rewrite模块将重写的URL传回给Apache做进一步处理
[OR] Or(逻辑或) : 用逻辑"或"将两个表达式连接在一起,如果结果为"真",则会应用后继的相关规则
[NE] No Escape(禁用转义) : 命令服务器在输出时禁用转义字符
[NS] No Subrequest(禁用子请求) : 如果存在内部子请求,则跳过当前命令
[QSA] Append Query String(追加查询字符串) : 命令服务器在URL末尾追加查询字符串
[S=x] Skip(跳过) : 如果满足某指定的条件,则跳过后面第x调规则
[E=variable:value] Environmental Variable(环境变量) : 命令服务器将值value赋给变量variable
[T=MIME-type] Mime Type(MIME类型) : 声明目标资源所属的MIME类型
例如thinkphp隐藏index.php:
<IfModule mod_rewrite.c> RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L] </IfModule>
上面部分摘抄自sjy之家:http://www.sjyhome.com/htaccess