在我们浏览网页时会发现,好多网页在浏览器地址栏中显示的的网站地址,带www前缀的二级域名以及不带www开头一级域名都可以直接访问,但在我们输入不带www的前缀的网址时,浏览器会自动跳转到带www的二级域名中去,这样是怎样实现的呢?
在apache2.4作为web服务器时,一般我们会在配置文件中为站点绑定两个域名.
配置如下:
<VirtualHost *:80>
DocumentRoot "C:/www"
ServerName www.xxxxx.xxx
ServerAlias xxxxx.xxx
<Directory "C:/www">
Options FollowSymLinks Includes
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
那么这样设置后,当我们访问自己配置的站点时,带www与不带的都可以访问了,但是却没有跳转,那么又该怎样设置呢?
首先我们可以开启Mod_Rewrite重写规则模块,它可以分析正则表达式来重写url的请求.
我们只需要在修改apache服务器conf目录下的httpd.conf配置文件。
将LoadModule rewrite_module modules/mod_rewrite.so前面的#号去掉后保存重启服务器即可.
然后在用记事本新建一个空白文本,然后另存为保存类型为所有文件,设置名称为.htaccess,需要注意的是它没有文件的名称,只有后缀.htaccess.
然后右键打开方式选择记事本为其添加以下代码:
<IfModule mod_rewrite.c>
Options +FollowSymlinks -Multiviews
RewriteEngine On
rewriteCond %{http_host} ^.xxx.xxx [NC]
rewriteRule ^(.*)$ https://www.xxx.xxx/$1 [R=301,L]
</IfModule>
然后将其保存,将.htaccess文件放在需要不带www跳转到带www的网站根目录中去即可生效.
在一些服务器配置中如果没有设置Options +FollowSymlinks可能会出现500的错误.mod_rewrite需要有followsymlinks使重写规则生效.
-MultiViews表示禁用访问到目录中没有的对象时,服务器会找该目录中下的同名文件.
rewriteCond匹配正则 %{http_host} ^.xxx.xxx
nc不区分大小写
rewriteRule重写规则为 ^(.*)$ http://www.xxx.xxx/$1
R=301重定向为301跳转,可以通过网站状态查询工具查询到被重定向的原地址状态码为301.
l表示最后一些解析规则.
这样我们就实现里在apache2.4服务器环境中,没有顶级域名直接301状态跳转到二级带www的域名中去了.