首先,我们来了解一下什么是域名跳转:
按自己的理解来说,就是你有多个域名,想指向一台服务器,使用一个服务器的资源
再形象一点,就是你A和B是两家人,吃饭的时候肯定是各回各家啦,于是服务器看了看A,说:"我认识你小子,你的家在X区域",看了看B说:"我也认识你小子你的家在Y区域",于是他们各自回到家中去吃饭。
但是如果A和B是一家人,是兄弟,虽然长得不一样(排除隔壁老王的嫌疑),但是还是要回到一家去吃点饭的。于是B就设置了一个301跳转,指向了A的家。
举个栗子:www.baidu.com/www.baidu.cn/www.baidu.xin等,访问的都是百度
对于我们的Apache来讲,配置域名跳转很简单,跟着KK来学习一下,康忙北鼻!
第一步:打开Apache的rewrite模块
vim /usr/local/apache2/conf/httpd.conf
在57行的地方找到如下内容
LoadModule rewrite_module modules/mod_rewrite.so
取消模块的注释符#,保证模块是被加载的状态
第二步:对相应的虚拟主机进行域名跳转301配置
vim /usr/local/apache2/conf/extra/httpd-vhosts.conf
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www.aaa.com$ [OR]
RewriteCond %{HTTP_HOST} ^www.bbb.com$
RewriteRule ^/(.*)$ http://www.google.hk/$1 [R=301,L]
</IfModule>
其实RewriteCond就像我们程序中的if语句一样,表示如果符合某个或某几个条件则执行RewriteCond下面紧邻的RewriteRule语句
%{HTTP_HOST} 是指环境变量:
其他的环境变量:
HTTP_USER_AGENT 用的啥服务器
HTTP_REFERER 从哪跳过来的(上一个网页是什么)
HTTP_COOKIE
HTTP_FORWARDED
HTTP_HOST 跳到了哪(www.baidu.com/tmp/1.php,这里只要www.baidu.com)
HTTP_PROXY_CONNECTION
HTTP_ACCEPT
^www.aaa.com$是正则表达式,代表网址是www.aaa.com
[OR]代表或则的意思,默认情况下多条RewriteCond语句中间是使用AND连接的,如果要使用或[OR],要明确指出来。
RewriteRule ^/(.*)$ http://www.google.hk/$1 指要重写的规则是什么,这里小括号括起来的部分被后面的$1引用,如果有第二个被小括号,可以用$2引用,这句话的意思是,请求www.aaa.com/****的任何网址,都会被重定向到www.google.hk/****下
其他一些符号的意义:
[R] 强制外部重定向
[F] 禁用url返回403
[P] 强制使用代理转发
[G] 强制URL为GONE,返回410HTTP状态码
[L] 表明当前规则是最后一条规则,停止分析以后规则的重写
[N] 重新从第一条规则开始运行重写过程
[NC] 不区分大小写
[PT] 传递给下一个处理
第三步:重启服务器
/usr/local/apache2/bin/apachectl restart
至此,跳转就配置完成了
小贴士:
其实我搜索了好久,但是真正详细讲301跳转的,真没几个,希望以后有机会可以更加深入的学习,有错误的话,还是希望各位大佬指出来哈。
最后的最后,奉上几个觉得有用的东东:
RewriteCond %{REQUEST_FILENAME} !-f //如果文件存在,就直接访问文件,不进行下面的RewriteRule.(不是文件或文件不存在就执行重写)
RewriteCond %{REQUEST_FILENAME} !-d //#如果目录存在就直接访问目录不进行RewriteRule
RewriteCond %{REQUEST_URI} !^.*(/.css|/.js|/.gif|/.png|/.jpg|/.jpeg)$ //#如果是这些后缀的文件,就直接访问文件,不进行Rewrite