RewriteEngine On

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

RewriteCond %{REQUEST_URI} !^/blog/

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

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

# 没有输入文件名的默认到到首页
RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$

RewriteRule ^(/)?$ blog/index.php [L]

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

【RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$】重写条件
前面%{HTTP_HOST}表示当前访问的网址,只是指前缀部分,格式是www.xxx.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次(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]忽略大小写的
  • 如果后面还继续有语句的,就不应该加上最后的[L],因为这是表示最后一条语句的意思

疑问:

RewriteRule ^(.*)$ /blog/$1前部分^(.*)$将会匹配当前请求的url
例如:请求网址 http://www.xxx.com/a.html 时,到底是匹配整个 http://www.xxx.com/a.html, 还是只匹配 /a.html 即反斜杠后面的成分,还是只匹配 a.html ?
根据 RewriteBase规则规定,如果 rewritebase 为/,将会匹配 a.html,不带前面的反斜杠,所以上条语句应该写成RewriteRule ^(.*)$ blog/$1(不带/)
如果不设置rewritebase 为/ ,将会匹配整个网址 http://www.xxx.com/a.html, 显然这是错误的,所以应该添加这条:
RewiteBase /

rewritecond的其他用法:
‘-d’(目录)
将TestString视为一个路径名并测试它是否为一个存在的目录。
‘-f’(常规文件)
将TestString视为一个路径名并测试它是否为一个存在的常规文件。
‘-s’(非空的常规文件)
将TestString视为一个路径名并测试它是否为一个存在的、尺寸大于0的常规文件。
‘-l’(符号连接)
将TestString视为一个路径名并测试它是否为一个存在的符号连接。
‘-x’(可执行)
将TestString视为一个路径名并测试它是否为一个存在的、具有可执行权限的文件。该权限由操作系统检测。
‘-F’(对子请求存在的文件)
检查TestString是否为一个有效的文件,而且可以在服务器当前的访问控制配置下被访问。它使用一个内部子请求来做检查,由于会降低服务器的性能,所以请谨慎使用!
‘-U’(对子请求存在的URL)
检查TestString是否为一个有效的URL,而且可以在服务器当前的访问控制配置下被访问。它使用一个内部子请求来做检查,由于会降低服务器的性能,所以请谨慎使用!

RewriteCond下:

[NC] 不分字母大小写

[OR] 用于连接下一条规则

RewriteRule下:
[R] 强制重定向,[R=code] code默认为302
[F] 禁用URL,返回HTTP 403 错误
[L] 这是最后一条规则,之后内容无用

一、防盗链功能
1 RewriteEngine On
2 RewriteCond %{HTTP_REFERER} !^http://(.+.)?mysite.com/ [NC]
3 RewriteCond %{HTTP_REFERER} !^$
4 RewriteRule .*.(jpe?g|gif|bmp|png)$ /images/nohotlink.jpg [L]

二、网址规范化
1 Options +FollowSymLinks
2 rewriteEngine on
3 rewriteCond %{http_host} ^yourdomain.com [NC]
4 rewriteRule ^(.*)$ http://www.yourdomain.com/$1 [R=301,L]

三、临时错误页面
当你的网站在升级、修改的时候,你最好让访客转到指定的页面,而不是没做完的页面或者是错误页。
这时我们做一个302转跳就好。
1 RewriteEngine on
2 RewriteCond %{REQUEST_URI} !/maintenance.html$
3 RewriteCond %{REMOTE_ADDR} !^123.123.123.123
4 RewriteRule $ /error.html [R=302,L]

作者 admin

百度广告效果展示