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

 

posted @ 2016-03-31 13:25  锅盖头  阅读(3011)  评论(0编辑  收藏  举报