一、 htaccess是什么?

概述来说,htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。

Unix、Linux系统或者是任何版本的Apache Web服务器都是支持.htaccess的,但是有的主机服务商可能不允许你自定义自己的.htaccess文件。

二、.htaccess都可以做什么?  

.htaccess文件可以的事情,主要包括:文件夹密码保护、用户自定义重定向、自定义404页面、扩展名伪静态化、禁止特定IP地址的用户、只允许特定IP地址的用户、禁止目录列表,等等。

通过htaccess文件,可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。

三、.htaccess语法规则 

RewriteCond (可以理解为if)

语法结构

RewriteCond String Pattern [flags]

RewriteCond指令定义一条规则条件。在一条RewriteRule指令前面可能会有一条或多条RewriteCond指令,只有当RewriteCond的条件(CondPattern)匹配成功时,RewriteRule的重写规则才被应用于当前URL处理。

TestString是一个纯文本的字符串,除了包含普通的字符外,还可以包括下列的变量结构扩展:
RewriteMap扩展:引用方法是:${mapname:key|default} 细节请参见RewriteMap指令 。

TestString可以包含服务器变量 ,引用方法是:%{NAME_OF_VARIABLE}

NAME_OF_VARIABLE可以是下表列出的字符串之一:

HTTP_USER_AGENT

HTTP_REFERER

HTTP_COOKIE

HTTP_FORWARDED

HTTP_HOST

HTTP_PROXY_CONNECTION

HTTP_ACCEPT

REMOTE_ADDR

REMOTE_HOST

REMOTE_USER

REMOTE_IDENT

REQUEST_METHOD

SCRIPT_FILENAME

PATH_INFO

QUERY_STRING

AUTH_TYPE

DOCUMENT_ROOT

SERVER_ADMIN

SERVER_NAME

SERVER_ADDR

SERVER_PORT

SERVER_PROTOCOL

SERVER_SOFTWARE

TIME_YEAR

TIME_MON

TIME_DAY

TIME_HOUR

TIME_MIN

TIME_SEC

TIME_WDAY

TIME

API_VERSION

THE_REQUEST

REQUEST_URI

REQUEST_FILENAME

IS_SUBREQ

RewriteRule

语法结构

RewriteRule pattern target [Flag1,Flag2,Flag3]

RewriteRule flag

 

 rewritecond的其他用法:

“-d”(目录)

将TestString视为一个路径名并测试它是否为一个存在的目录。

“-f”(常规文件)

将TestString视为一个路径名并测试它是否为一个存在的常规文件。

“-s”(非空的常规文件)

将TestString视为一个路径名并测试它是否为一个存在的、尺寸大于0的常规文件。

“-l”(符号连接)

将TestString视为一个路径名并测试它是否为一个存在的符号连接。

“-x”(可执行)

将TestString视为一个路径名并测试它是否为一个存在的、具有可执行权限的文件。该权限由操作系统检测。

“-F”(对子请求存在的文件)

检查TestString是否为一个有效的文件,而且可以在服务器当前的访问控制配置下被访问。它使用一个内部子请求来做检查,由于会降低服务器的性能,所以请谨慎使用!

“-U”(对子请求存在的URL)

检查TestString是否为一个有效的URL,而且可以在服务器当前的访问控制配置下被访问。它使用一个内部子请求来做检查,由于会降低服务器的性能,所以请谨慎使用!

四、.htaccess常见使示例解释

一个图片防盗链的例子:

RewriteEngine On //On|Off,RewriteEngine 用于开启或停用rewrite功能
RewiteBase / //RewriteBase URL-path,设定基准目录,例如希望对根目录下的文件rewrtie,就是”/”
RewriteCond %{HTTP_REFERER} !^http://(.+.)?baidu.com/ [NC] //如果来源网址不是*.baidu.com
RewriteCond %{HTTP_REFERER} !^$ //并且来源网址不是空
RewriteRule .*.(jpe?g|gif|bmp|png)$ /images/nohotlink.jpg [L] //如果访问的文件后缀是jpeg,jpg,gif,bmp,png的图片,则重定向到一个固定的图片

额外说明

1、RewriteBase用于设定重写的基准URL。在对一个新的URL进行替换时,此模块必须把这个URL重新注入到服务器处理中。为此,它必须知道其对应的URL前缀或者说URL基准。通常,此前缀就是对应的文件路径。但是,大多数网站URL不是直接对应于其物理文件路径的,因而一般不能做这样的假定!所以在这种情况下,就必须用RewriteBase指令来指定正确的URL前缀。如果你的网站服务器URL不是与物理文件路径直接对应的,而又需要使用RewriteBase指令,则必须在每个对应的.htaccess文件中指定RewriteRule。

2、RewriteRule Pattern Substitution [Flags] 其中的Pattern就是参数,一般为一些文件的扩展名;Substitution是用来替换前面用的;这儿的Flags,参考上面的表格,常用的R表示 redirect(强制重定向),F表示forbidden(禁止访问),L表示last(最后),通常当你希望停止重写操作而立即重定向时,可用它。

3、RewriteRule反向引用:

引用方法是 $N (0 <= N <= 9) 引用当前(带有若干RewriteCond指令的)RewriteRule中的 与pattern匹配的分组成分(圆括号!)。

4、RewriteCond反向引用:

引用方法是 %N (1 <= N <= 9) 引用当前若干RewriteCond条件中最后符合的条件中的分组成分(圆括号!)。

5、RewriteMap 扩展:

引用方法是 ${mapname:key|default}

6、服务器变量:

引用方法是 %{ NAME_OF_VARIABLE } 这个是我们最常使用到的功能

7、CondPattern:

是条件pattern, 即, 一个应用于当前实例TestString的正则表达式, 即, TestString将会被计算然后与CondPattern匹配.可以在pattern串中使用!字符(惊叹号)来实现匹配的反转。

五、更多使用示例

1、图片重定向

RewriteEngine On
RewriteCond %{HTTP_HOST} ^localhost$ //如果域名是localhost
RewriteCond %{REQUEST_FILENAME} !-f //并且访问的文件找不到
RewriteRule ^images/(.+) http://127.0.0.1/test/showimages/$1 [R=302,L] //则跳转到另一个域名下的另一个目录访问这个图片

2、二级域名重定向到www.teslacar.vip

rewriteEngine on
rewriteCond %{http_host} ^teslacar.vip [NC]
rewriteRule ^(.*)$ http://www.teslacar.vip/$1 [R=301,L]

3、网站升级时,临时错误页面

RewriteEngine on
RewriteCond %{REQUEST_URI} !/teslacar.html$ //如果请求的地址不是teslacar.html
RewriteCond %{REMOTE_ADDR} !^123.123.123.123 //客户端ip如果不是这个
RewriteRule $ /error.html [R=302,L] //则重定向到error.html这个升级提醒页面

4、重定向RSS地址到FeedSky

RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} !FeedSky [NC]
RewriteCond %{HTTP_USER_AGENT} !FeedValidator [NC]
RewriteRule ^feed/?([_0-9a-z-]+)?/?$ http://feed.feedsky.com/yours

5、防止目录浏览

Options All -Indexes

6、404重定向

ErrorDocument 404 /404.html

7、设置目录默认页面

DirectoryIndex about.html

备注:.htaccess的权限要设置成644