您的位置:首页 > 其它

.htaccess文件详解

2016-10-11 11:35 190 查看
好记性不如烂笔头,这个东西来回记了两次,完了用的时候还是问百度,今天决定记载下来。虽然文章类型是转载,可是这都是我自己敲的,我自己总结的当然了,我只是借鉴了别人的知识成果。

.htaccess文件是apache的分布式配置文件。他负责相关目录下的网页配置,通过.htaccess可以帮我们实现。必须以ASCII模式上传,并且给其可读性。

.htaccess可以帮我们实现:网页301重定向,自定义404错误页面,改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、封禁特定IP地址的用户,只允许特定IP地址的用户,以及使用其他文件作为index文件配置默认文档等功能。

.htaccess文件一般情况下,不应该使用.htaccess文件,除非对主配置文件没有访问权限。用户认证不但能使用.htaccess文件实现,把用户认证写在主配置文件中是完全可行的,而且是一种很好的方法。

任何希望放在.htaccess 文件中的配置,都可以在主配置文件的<Directory>段中,而且更高效。

避免使用.htaccess文件有两个主要原因:

①性能。如果AllowOverride启用了.htaccess文件,则Apache需要在每个目录查找.htaccess文件,无论是否找到,启用都会导致性能下降。另外,对每一个请求,都需要读取一次.htaccess文件,还有Apache必须在所有上级的目录中查找.htaccess文件,以使所有有效的指令都起作用,例如:

如果请求/www/htdocs/example中的页面,Apache必须查找以下文件:

/.htaccess /www/.htaccess /www/htdocs/.htaccess /www/htdocs/example/.htaccess

②安全。这样会允许用户自己修改服务器的配置,这会导致某些意想不到的修改。

注意:在/www/htdocs/example目录下的.htaccess文件中的放置指令,与在主配置文件中<Directory /www/htdocs/example>段中放置相同的指令,是完全等效的。

下面写一些.htaccess 文件中常用的一些内容,然后在逐一解释。

RewriteEngine On

RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$

RewriteCOnd %{REQUEST_URI} !^/blog/

RewriteCond %{REQUEST_FILENAME} !-f

RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^(.*)$ /blog/$1

注意解释:

①RewriteEngine On:表示重写引擎开,关闭off,作用就是方便的开启或关闭以下的语句,这样就不需要一条一条的注释语句了。

②RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$ : 这是重写条件,前面%{HTTP_HOST}表示当前访问的网址,格式是www.xx.com不包括“http://”和“/”,^表示字符串开始,$表示字符串结尾,\.表示转义的.,如果不转义也行,推荐转义,防止有些服务器不支持,?表示前面括号www\.出现0次或1次,这句规则的意思就是如果访问的网址是xxx.com或者www.xxx.com就执行以下的语句,不符合就跳过。

③RewriteCond %{REQUEST_URI} !^/blog/:也是重写条件,%{REQUEST_URI}表示访问的相对地址,就是相对根目录的地址,就是域名/后面的成分,格式上包括最前面的“/”,!表示非,这句话表示访问的地址不以/blog/开头,只是开头,没有结尾$。



RewriteCond %{REQUEST_FILENAME} !-f

RewriteCond %{REQUEST_FILENAME} !-d

这两家话的意思是请求的文件或路径是不存在的,如果文件或路径存在将返回已经存在的文件或路径。
⑤RewriteRule ^(.*)$ /blog/$1:重写规则,最重要的部分,意思是当上面的rewriteCond条件都满足的时候,将会执行此重写规则,^(.*)$是一个正则表达的匹配,匹配的是当前请求的URL,^(.*)$意思是匹配当前URL任意字符,表示任意单个字符,.表示任意单个字符,*表示匹配0次或者N次,后面/blog/$1是重写成分,意思是将前面匹配的字符重写成/blog/$1,这个$1表示反向匹配,引用的是前面 的第一个圆括号的成分,即^(.*)$中的.*,将会匹配当前的请求url。

⑥Linux系统是区分大小写的,所以RewriteCond后添加【NC】忽略大小写。

即:  RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$ [NC]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  .htaccess