apache rewrite重定向规则,rewrite正则,二级域名指向一级域名,多域名指向一个域名,IP转向域名
首先有一台linux服务器,上面有4个IP都可以指向这个服务器,有10个域名
www.zhishiwu.com
4个IP分别是
1.1.1.1
1.1.1.2
1.1.1.3
1.1.1.4
10个域名分别是
a.com a.org 对应ip 1.1.1.1 对应网站目录在 /home/www/a
b.com b.org 对应ip 1.1.1.2 对应网站目录在 /home/www/b
c.com c.org c.net 对应ip 1.1.1.3 对应网站目录在 /home/www/c
d.com e.org f.net 对应ip 1.1.1.4 对应网站目录在 /home/www/d
现在想要实现这个效果
当输入ip地址 1.1.1.1 或者输入 a.com a.org 时候,系统自动跳转到 www.a.com
当输入ip地址 1.1.1.2 或者输入 b.com b.org 时候,系统自动跳转到 www.b.com
当输入ip地址 1.1.1.3 或者输入 c.com c.org c.net 时候,系统自动跳转到 www.c.com
当输入ip地址 1.1.1.4 或者输入 d.com e.org f.net时候,系统自动跳转到 www.e.org
当 输入 aaa.a.com bbb.a.com 111.a.com 222.a.org 等a.com 和 a.org 的不存在的二级域名时,自动跳转到 www.a.com 这个一级规范域名上.
需要做这几个方面的工作
第一种方法是修改服务器 第二种是修改目录,也就是增加一个.htaccess,第二种方法和第一种的内容其实是一样的,唯一需要注意的是修改目录的话,需要打开目录的FollowSymLinks,并且在.htaccess也要写上RewriteEngine on
也就是你修改网站目录所在地的那段,防止网站内容以列表的形式展示出来.(关闭是Options -Indexes FollowSymLinks,开启就是Options Indexes FollowSymLinks)
1: 打开域名管理的泛域名解析. 也就是增加域名的A记录 比如 a.com , 本来A记录那里有一条记录 @ 指向 1.1.1.1 增加一条 * 指向 1.1.1.1 其它域名同
泛域名解析用在当这个二级域名没有内容时,或者是不存在时是比较有用的.如果存在二级域名对应的内容,比如 bbs.a.com forum.a.com shop.a.com mail就需要去域名的管理里面,增加cname, host 写 bbs 或者 forum 或者 shop mail等,指向 bbs.a.com forum.a.com shop.a.com mail.a.com 其它同
保存域名修改 大约1个小时左右生效(godaddy的几分钟就生效了.)
www.zhishiwu.com
2:打开apache的http.conf文件.
检查下LoadModule rewrite_module modules/mod_rewrite.so 是否开启,没有开启需要去掉#开启,并且检查下modules是否存在这个,如果没有需要重新编译这个模块
3: 在最后面增加下面的内容
NameVirtualHost 1.1.1.1:80
NameVirtualHost 1.1.1.2:80
NameVirtualHost 1.1.1.3:80
NameVirtualHost 1.1.1.4:80
RewriteEngine on
www.zhishiwu.com
<VirtualHost 1.1.1.1:80>
ServerAdmin rainysia@gmail.com
DocumentRoot /home/www/a
ServerName www.a.com
ServerAlias *.a.com *.a.org
DirectoryIndex index.html index.htm index.php index.shtml index.shtm index.tpl
RewriteEngine on
RewriteCond %{HTTP_HOST} !^www.a.com [NC]
RewriteCond %{HTTP_HOST} !^$
RewriteRule ^(.*) http://www.a.com/ [L]
</VirtualHost>
<VirtualHost 1.1.1.2:80>
ServerAdmin rainysia@gmail.com
DocumentRoot /home/www/b
ServerName www.b.com
ServerAlias *.b.com *.b.org
DirectoryIndex index.html index.htm index.php index.shtml index.shtm index.tpl
RewriteEngine on
RewriteCond %{HTTP_HOST} !^www.b.com [NC]
RewriteCond %{HTTP_HOST} !^$
RewriteRule ^(.*) http://www.b.com/ [L]
</VirtualHost>
<VirtualHost 1.1.1.3:80>
ServerAdmin rainysia@gmail.com
DocumentRoot /home/www/c
ServerName www.c.com
ServerAlias *.c.com *.c.org *.c.net
DirectoryIndex index.html index.htm index.php index.shtml index.shtm index.tpl
RewriteEngine on
RewriteCond %{HTTP_HOST} !^www.c.com [NC]
RewriteCond %{HTTP_HOST} !^$
RewriteRule ^(.*) http://www.c.com/ [L]
</VirtualHost>
www.zhishiwu.com
<VirtualHost 1.1.1.4:80>
ServerAdmin rainysia@gmail.com
DocumentRoot /home/www/d
ServerName www.e.org
ServerAlias *.d.com *.e.org *.f.net
DirectoryIndex index.html index.htm index.php index.shtml index.shtm index.tpl
RewriteEngine on
RewriteCond %{HTTP_HOST} !^www.e.org [NC]
RewriteCond %{HTTP_HOST} !^$
RewriteRule ^(.*) http://www.e.org/ [L]
</VirtualHost>
然后保存退出后 /etc/init.d/httpd restart 重启apache既可生效
用www.a.com的重写规则来解释
!的意思是否 也就是说 RewriteCond 只要不是通过www.a.com,那么就转向到这个www.a.com,包括你通过IP,二级域名等来访问,都会因为这条而转向
apache的rewrite正则的一些定义, 完全是符合perl的正则
其中文本
. 表示一个单字符
[string] 字符类string中的任意一个字符
[^string] 字符类的非,也就是不在string中的字符
text1 | text2 或者条件 经常用在域名后缀, 比如 org | com | net 这种
计数 ? 前面的字符出现0或1次 * 当前就是0次或N次 + 就是出现1次或N次
分组 (text) 用于设置一个选择的边界,或者生成后引用, 在RewriteRule中可以用$N来引用第N个分组
锚 ^ 锚到行首 $ 锚到行尾
转义 /c 对给定的字符c进行转义 对其它的符号转义 比如" . [ ] ( ) 等等
www.zhishiwu.com
中括号里面的内容的解释
1) R[=code](force redirect) 强制外部重定向
强制在替代字符串加上http://thishost[:thisport]/前缀重定向到外部的URL.如果code不指定,将用缺省的302 HTTP状态码。
2) F(force URL to be forbidden)禁用URL,返回403HTTP状态码。
3) G(force URL to be gone) 强制URL为GONE,返回410HTTP状态码。
4) P(force proxy) 强制使用代理转发。
5) L(last rule) 表明当前规则是最后一条规则,停止分析以后规则的重写。
6) N(next round) 重新从第一条规则开始运行重写过程。
7) C(chained with next rule) 与下一条规则关联
如果规则匹配则正常处理,该标志无效,如果不匹配,那么下面所有关联的规则都跳过。
8) T=MIME-type(force MIME type) 强制MIME类型
9) NS (used only if no internal sub-request) 只用于不是内部子请求
10) NC(no case) 不区分大小写
11) QSA(query string append) 追加请求字符串
12) NE(no URI escaping of output) 不在输出转义特殊字符
例如:RewriteRule /foo/(.*) /bar?arg=P1%3d$1 [R,NE] 将能正确的将/foo/zoo转换成/bar?arg=P1=zoo
13) PT(pass through to next handler) 传递给下一个处理
例如:
RewriteRule ^/abc(.*) /def$1 [PT] # 将会交给/def规则处理
Alias /def /ghi
14) S=num(skip next rule(s)) 跳过num条规则
15) E=VAR:VAL(set environment variable) 设置环境变量
作者 rainysia