.htaccess参数说明以及如何写

大超

htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。重定向插件Helicon ISAPI_Rewrite 3.1版本也使用这个文件,语法基本一样。

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

【RewriteEngine on】表示重写引擎开启,如果要关闭就改为off,作用就是开启或关闭以下的语句,这样就不需要一条一条的注释语句了。

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

【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表示反向匹配,引用的是前面第一个圆括号的部分,即^(.*)$中 的.* 。

这里会有一个问题:根据RewriteBase规则规定,如果rewritebase为/,将会匹配a.html,不带前面的反斜杠,所以上条语句应该写成RewriteRule ^(.*)$ blog/$1(不带/),不过实际应用上带上前面的反斜杠,也可以用,可能带不带都行。现在问题出来了,如果不设置rewritebase 为/ ,将会匹配整个网址http://www.niuchao.com/a.html,显然这是错误的,所以应该添加这条:RewiteBase /。

还有一个问题:你不能保证每个人输入的网址都是小写的,如果输入大写的呢?linux系统是区分大小写的,所以应该在RewriteCond后添加[NC]忽略大小写。

【RewriteCond %{HTTP_HOST} ^(www.)?niuchao.com$】【RewriteRule ^(/)?$ blog/index.php [L]】这两句的意思是指请求的host地址是www.niuchao.com或niuchao.com时,如果地址的结尾只有0个或者1个“/”时,将会重写到子目录下的主页,这主要因为重写后的地址是不能自动寻找主页的,需要自己指定。如果后面还继续有语句的,就不应该加上最后的[L],因为这是表示最后一条语句的意思。


完整的htaccess语句

RewriteEngine On
RewiteBase /
RewriteCond %{HTTP_HOST} ^(www.)?xxx.com$ [NC]
RewriteCond %{REQUEST_URI} !^/blog/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ blog/$1</p><p># 没有输入文件名的默认到到首页
RewriteCond %{HTTP_HOST} ^(www.)?xxx.com$ [NC]
RewriteRule ^(/)?$ blog/index.php [L]

防盗链语句

RewriteEngine on
RewiteBase /
RewriteCond %{HTTP_REFERER} !^$ [NC]
RewriteCond %{HTTP_REFERER} !niuchao.com [NC]
RewriteRule .(jpg|gif|png|bmp|swf|jpeg)$ /error/daolian.gif [R,NC,L]

网址规范化htaccess语句

RewriteEngine on
RewriteCond %{http_host} ^niuchao.com [NC]
RewriteRule ^(.*)$ https://www.niuchao.com/$1 [R=301,L]

自定义404错误页面

ErrorDocument 404 /404.html

网站升级的时候,只有特定IP才能访问,其他的用户将看到一个升级页面

RewriteEngine on
RewriteCond %{REQUEST_URI} !/upgrade.html$
RewriteCond %{REMOTE_HOST} !^24.121.202.30
RewriteRule $ https://niuchao.com/upgrade.html [R=302,L]

老域名转向新域名

RewriteEngine On
RewriteRule ^(.*)$ https://niuchao.com/$1[R=301,L]

还有很多htaccess语句规则

# 把html后缀的url链接到php文件
# $1指代的是前面第1个用括号括起来的内容
RewriteRule ^/?([a-z/]+).html$ $1.php [L]
# 或者把旧文件夹的内容链接到新文件夹
RewriteRule ^/?old_directory/([a-z/.]+)$ new_directory/$1 [R=301,L]
# 隐藏文件名
RewriteRule ^/?([a-z]+)$ $1.php [L]

最后,把一些常用的正则表达式列一下吧

w匹配字母或数字或下划线或汉字
s匹配任意的空白符
d匹配数字
匹配单词的开始或结束
^匹配字符串的开始
$匹配字符串的结束
*重复零次或更多次
+重复一次或更多次
?重复零次或一次
{n}重复n次
{n,}重复n次或更多次
{n,m}重复n到m次

应用替换时,前面第一个()中匹配的内容后面就用$1引用,第二个()中匹配的就用$2引用。

如果有新的经验和总结,我会把此文继续编辑,喜欢的点个赞呗!

有问题可在下方评论留言,或关注“大超小志”微信公众号留言。

标签: htaccess 301重定向

留言评论

如需留言或评论,请在微信中打开此页面。