.htaccess是什么
.htaccess⽂件(或者\"分布式配置⽂件\")提供了针对⽬录改变配置的⽅法, 即,在⼀个特定的⽂档⽬录中放置⼀个包含⼀个或多个指令的⽂件, 以作⽤于此⽬录及其所有⼦⽬录。作为⽤户,所能使⽤的命令受到限制。管理员可以通过Apache的AllowOverride指令来设置。概述来说,htaccess⽂件是Apache服务器中的⼀个配置⽂件,它负责相关⽬录下的⽹页配置。通过htaccess⽂件,可以帮我们实现:⽹页301重定向、⾃定义404错误页⾯、改变⽂件扩展名、允许/阻⽌特定的⽤户或者⽬录的访问、禁⽌⽬录列表、配置默认⽂档等功能。启⽤.htaccess,需要修改httpd.conf,启⽤AllowOverride,并可以⽤AllowOverride限制特定命令的使⽤。如果需要使⽤.htaccess以外的其他⽂件名,可以⽤AccessFileName指令来改变。例如,需要使⽤.config ,则可以在服务器配置⽂件中按以下⽅法配置:AccessFileName.config 。
笼统地说,.htaccess可以帮我们实现包括:⽂件夹密码保护、⽤户⾃动重定向、⾃定义错误页⾯、改变你的⽂件扩展名、封禁特定IP地址的⽤户、只允许特定IP地址的⽤户、禁⽌⽬录列表,以及使⽤其他⽂件作为index⽂件等⼀些功能。 ⼯作原理
.htaccess⽂件(或者\"分布式配置⽂件\")提供了针对每个⽬录改变配置的⽅法,即在⼀个特定的⽬录中放置⼀个包含指令的⽂件,其中的指令作⽤于此⽬录及其所有⼦⽬录。说明:
如果需要使⽤.htaccess以外的其他⽂件名,可以⽤AccessFileName指令来改变。例如,需要使⽤.config ,则可以在服务器配置⽂件中按以下⽅法配置:
AccessFileName .config
通常,.htaccess⽂件使⽤的配置语法和主配置⽂件⼀样。AllowOverride指令按类别决定了.htaccess⽂件中哪些指令才是有效的。如果⼀个指令允许在.htaccess中使⽤,那么在本⼿册的说明中,此指令会有⼀个覆盖项段,其中说明了为使此指令⽣效⽽必须在AllowOverride指令中设置的值。
(不)使⽤.htaccess⽂件的场合
⼀般情况下,不应该使⽤.htaccess⽂件,除⾮你对主配置⽂件没有访问权限。有⼀种很常见的误解,认为⽤户认证只能通过.htaccess⽂件实现,其实并不是这样,把⽤户认证写在主配置⽂件中是完全可⾏的,⽽且是⼀种很好的⽅法。
.htaccess⽂件应该被⽤在内容提供者需要针对特定⽬录改变服务器的配置⽽⼜没有root权限的情况下。如果服务器管理员不愿意频繁修改配置,则可以允许⽤户通过.htaccess⽂件⾃⼰修改配置,尤其是ISP在同⼀个机器上运⾏了多个⽤户站点,⽽⼜希望⽤户可以⾃⼰改变配置的情况下。
虽然如此,⼀般都应该尽可能地避免使⽤.htaccess⽂件。任何希望放在.htaccess⽂件中的配置,都可以放在主配置⽂件的 避免使⽤.htaccess⽂件有两个主要原因。 ⾸先是性能。如果AllowOverride启⽤了.htaccess⽂件,则Apache需要在每个⽬录中查找.htaccess⽂件,因此,⽆论是否真正⽤到,启⽤.htaccess都会导致性能的下降。另外,对每⼀个请求,都需要读取⼀次.htaccess⽂件。 还有,Apache必须在所有上级的⽬录中查找.htaccess⽂件,以使所有有效的指令都起作⽤(参见指令的⽣效),所以,如果请求/www/htdocs/example中的页⾯,Apache必须查找以下⽂件: /.htaccess /www/.htaccess /www/htdocs/.htaccess /www/htdocs/example/.htaccess 总共要访问4个额外的⽂件,即使这些⽂件都不存在。(注意,这可能仅仅由于允许根⽬录\"/\"使⽤.htaccess ,虽然这种情况并不多。) 其次是安全。这样会允许⽤户⾃⼰修改服务器的配置,这可能会导致某些意想不到的修改,所以请认真考虑是否应当给予⽤户这样的特权。但是,如果给予⽤户较少的特权⽽不能满⾜其需要,则会带来额外的技术⽀持请求,所以,必须明确地告诉⽤户已经给予他们的权限,说明AllowOverride设置的值,并引导他们参阅相应的说明,以免⽇后⽣出许多⿇烦。 注意,在/www/htdocs/example⽬录下的.htaccess⽂件中放置指令,与在主配置⽂件中 /www/htdocs/example⽬录下的.htaccess⽂件的内容: AddType text/example .exm httpd.conf⽂件中摘录的内容: 但是,把配置放在主配置⽂件中更加⾼效,因为只需要在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实例 因篇幅问题不能全部显示,请点此查看更多更全内容