段中放置相同指令,是完全等效的。/www/htdocs/example⽬录下的.htaccess⽂件的内容: AddType text/example .exm httpd.conf⽂件中摘录的内容: AddType text/example .exm
但是,把配置放在主配置⽂件中更加⾼效,因为只需要在Apache启动时读取⼀次,⽽不是在每次⽂件被请求时都读取。 将AllowOverride设置为none可以完全禁⽌使⽤.htaccess⽂件: AllowOverride None
指令的作⽤范围
.htaccess⽂件中的配置指令作⽤于.htaccess⽂件所在的⽬录及其所有⼦⽬录,但是很重要的、需要注意的是,其上级⽬录也可能会
有.htaccess⽂件,⽽指令是按查找顺序依次⽣效的,所以⼀个特定⽬录下的.htaccess⽂件中的指令可能会覆盖其上级⽬录中的.htaccess⽂件中的指令,即⼦⽬录中的指令会覆盖⽗⽬录或者主配置⽂件中的指令。 疑难解答
如果在.htaccess⽂件中的某些指令不起作⽤,可能有多种原因。
最常见的原因是AllowOverride指令没有被正确设置,必须确保没有对此⽂件区域设置 AllowOverride None 。有⼀个很好的测试⽅法,就是在.htaccess⽂件随便增加点⽆意义的垃圾内容,如果服务器没有返回了⼀个错误消息,那么⼏乎可以断定设置了 AllowOverride None。
在访问⽂档时,如果收到服务器的出错消息,应该检查Apache的错误⽇志,可以知道.htaccess⽂件中哪些指令是不允许使⽤的,也可能会发现需要纠正的语法错误。
.htaccess⼯具
不会写的朋友,在这介绍⼀款很不错.htaccess的重定向—URL重写⼯具rewriting-tool--------------------------------------------------------------------------------htaccess语法教程
RewriteEngine On
RewriteCond %{HTTP_HOST} ^(www\\.)?xxx\\.com$RewriteCond %{REQUEST_URI} !^/blog/RewriteCond %{REQUEST_FILENAME} !-fRewriteCond %{REQUEST_FILENAME} !-dRewriteRule ^(.*)$ /blog/$1
# 没有输⼊⽂件名的默认到到⾸页
RewriteCond %{HTTP_HOST} ^(www\\.)?xxx\\.com$RewriteRule ^(/)?$ blog/index.php [L]
下⾯我开始解说⼀下上⾯的意思:
【RewriteEngine On】
表⽰重写引擎开,关闭off,作⽤就是⽅便的开启或关闭以下的语句,这样就不需要⼀条⼀条的注释语句了。
【RewriteCond %{REQUEST_URI} !^/blog/】
也是重写条件,%{REQUEST_URI}表⽰访问的相对地址,就是相对根⽬录的地址,就是域名/后⾯的成分,格式上包括最前⾯的“/”,!表⽰⾮,这句语句表⽰访问的地址不以/blog/开头,只是开头^,没有结尾$
【RewriteCond %{REQUEST_FILENAME} !-f】【RewriteCond %{REQUEST_FILENAME} !-d】
这两句语句的意思是请求的⽂件或路径是不存在的,如果⽂件或路径存在将返回已经存在的⽂件或路径
【RewriteRule ^(.*)$ /blog/$1】
重写规则,最重要的部分,意思是当上⾯的RewriteCond条件都满⾜的时候,将会执⾏此重写规则,^(.*)$是⼀个正则表达的 匹配,匹配的是当前请求的URL,^(.*)$意思是匹配当前URL任意字符,.表⽰任意单个字符,*表⽰匹配0次或N次(N>0),后⾯ /blog/$1是重写成分,意思是将前⾯匹配的字符重写成/blog/$1,这个$1表⽰反向匹配,引⽤的是前⾯第⼀个圆括号的成分,即^(.*)$中 的.* ,其实这⼉将会出现⼀个问题,后⾯讨论。
【RewriteCond %{HTTP_HOST} ^(www\\.)?xxx\\.com$】【RewriteRule ^(/)?$ blog/index.php [L]】
这两句的意思是指请求的host地址是www.xxx.com是,如果地址的结尾只有0个或者1个“/”时,将会重写到⼦⽬录下的主页,我猜想这主要因为重写后的地址是不能⾃动寻找主页的,需要⾃⼰指定。
还有⼀个问题是,不能保证每个⼈输⼊的⽹址都是⼩写的,如果输⼊⼤写的呢,linux系统是区分⼤⼩写的,所以应该在RewriteCond后添加[NC]忽略⼤⼩写的。⾄此,完整的语句应该是:
RewriteEngine OnRewiteBase /
RewriteCond %{HTTP_HOST} ^(www\\.)?xxx\\.com$ [NC]RewriteCond %{REQUEST_URI} !^/blog/RewriteCond %{REQUEST_FILENAME} !-fRewriteCond %{REQUEST_FILENAME} !-dRewriteRule ^(.*)$ blog/$1
# 没有输⼊⽂件名的默认到到⾸页
RewriteCond %{HTTP_HOST} ^(www\\.)?xxx\\.com$ [NC]
RewriteRule ^(/)?$ blog/index.php [L]
如果后⾯还继续有语句的,就不应该加上最后的[L],因为这是表⽰最后⼀条语句的意思。防盗链的语句,同样需要添加RewiteBase /,如下:
RewriteEngine onRewiteBase /
RewriteCond %{HTTP_REFERER} !^$ [NC]
RewriteCond %{HTTP_REFERER} !xxx.info [NC]
RewriteRule \\.(jpg|gif|png|bmp|swf|jpeg)$ /error/daolian.gif [R,NC,L]
如果后⾯还继续有语句的,就不应该加上最后的[L],/error/daolian.gif为别⼈盗链时显⽰的图⽚。
下⾯附上简单的语法规则和flags
【RewriteCond语法】
RewriteCond TestString CondPattern [flags]
rewritecond的其他⽤法:\"-d\"(⽬录)
将TestString视为⼀个路径名并测试它是否为⼀个存在的⽬录。\"-f\"(常规⽂件)
将TestString视为⼀个路径名并测试它是否为⼀个存在的常规⽂件。\"-s\"(⾮空的常规⽂件)
将TestString视为⼀个路径名并测试它是否为⼀个存在的、尺⼨⼤于0的常规⽂件。\"-l\"(符号连接)
将TestString视为⼀个路径名并测试它是否为⼀个存在的符号连接。\"-x\"(可执⾏)
将TestString视为⼀个路径名并测试它是否为⼀个存在的、具有可执⾏权限的⽂件。该权限由操作系统检测。\"-F\"(对⼦请求存在的⽂件)
检查TestString是否为⼀个有效的⽂件,⽽且可以在服务器当前的访问控制配置下被访问。它使⽤⼀个内部⼦请求来做检查,由于会降低服务器的性能,所以请谨慎使⽤!\"-U\"(对⼦请求存在的URL)
检查TestString是否为⼀个有效的URL,⽽且可以在服务器当前的访问控制配置下被访问。它使⽤⼀个内部⼦请求来做检查,由于会降低服务器的性能,所以请谨慎使⽤!【RewriteRule语法:】
RewriteRule Pattern Substitution [flags]
.htaccess实例