介绍
当您的网站或应用程序在域后面启动并运行时,通常还希望允许您的用户通过普通域名 和 访问它 www 子域。 也就是说,无论有没有“www”,他们都应该能够访问您的域。 前缀,例如 example.com
或 www.example.com
,在 Web 浏览器中显示相同的内容。 虽然有多种设置方法,但出于一致性和 SEO 考虑的最佳解决方案是选择您喜欢的域,普通域或 www,然后将另一个重定向到首选域。 这种类型的重定向称为 永久重定向 或“301 重定向”,可以通过正确配置 DNS 资源记录和 Web 服务器软件轻松设置。
本教程将向您展示如何将 www URL 重定向到非 www,例如 www.example.com
到 example.com
,在 Ubuntu 14.04 上使用 Apache。 我们还将向您展示如何从非 www 的 URL 重定向到 www。 本教程的 CentOS 7 版本可在 此处 获得。
如果您想使用 Nginx 作为您的 Web 服务器执行这种类型的重定向,您应该遵循本教程:如何在 Ubuntu 14.04 上使用 Nginx 将 www 重定向到非 www。
先决条件
本教程假设您拥有超级用户权限,即 sudo
或 root,在运行 Apache 的服务器上。 如果您还没有设置,请按照本教程进行操作:Ubuntu 14.04 上的初始服务器设置。
假设您已安装 Apache。 如果您还没有这个设置,在 Apache 标签 下有几个关于这个主题的教程。
您必须能够将记录添加到管理您的域的 DNS。 如果您还没有域名,您可以从域名注册商处购买一个,并使用注册商的 DNS 或 DigitalOcean 的 DNS 进行管理。 在本教程中,我们将使用 DigitalOcean DNS 创建必要的记录。
让我们开始配置您的 DNS 记录。
配置 DNS 记录
为了设置所需的重定向,从 www.example.com
到 example.com
或反之亦然,您必须为每个名称拥有一个 A 记录 。
打开用于管理 DNS 的任何内容。 对于我们的示例,我们将使用 DigitalOcean DNS。
如果域(也称为区域)记录尚不存在,请立即创建一个。 主机名 应该是您的域,例如 example.com
,并且IP地址应该设置为您的Apache服务器的公共IP地址。 这将自动创建一条 A 记录,将您的域指向您指定的 IP 地址。 如果您使用其他系统来管理您的域,则可能需要手动添加。
接下来,添加另一条以“www”作为主机名的 A 记录(如果部分子域不起作用,则添加“www.example.com”),并指定相同的 IP 地址。
当您创建了两条记录后,它应该如下所示:
注意: 这也适用于 CNAME 记录,只要规范名称的 A 记录是指您的 Apache Web 服务器的 IP 地址。
现在您的服务器应该可以通过 www 和非 www 域访问,但我们仍然需要设置重定向。 我们现在就这样做。
启用重写模块
为了执行 301 重定向,我们将使用 Apache mod_rewrite 或 Rewrite 模块。 这样做将确保您的用户可以使用或不使用 www. 前缀访问您的站点,并被重定向到您喜欢的域。
首先,使用以下命令启用 mod_rewrite 模块:
sudo a2enmod rewrite
启用 Rewrite 模块后,我们可以使用 .htaccess
文件为 Apache 配置重定向规则。
启用 .htaccess 文件
打开 Apache 配置文件进行编辑。 在 Ubuntu 上,默认配置文件位于 /etc/apache2/sites-enabled/000-default.conf
,因此我们将在示例中使用它:
sudo vi /etc/apache2/sites-enabled/000-default.conf
找到您网站的 DocumentRoot,并记下它。 默认情况下,它是 /var/www/html
,因此我们将在示例配置中使用它。
将以下 Directory 指令添加到配置中,并确保将 DocumentRoot 替换为突出显示的部分:
添加到 Apache 配置
<Directory /var/www/html> Options Indexes FollowSymLinks MultiViews AllowOverride All Order allow,deny allow from all </Directory>
保存并退出。
现在重新启动 Apache 以使更改生效:
sudo service apache2 restart
现在 Apache 被配置为读取位于 /var/www/html
目录下任何位置的 .htaccess
文件。 现在让我们添加我们的重写规则。
配置重写模块
如前所述,我们将使用 .htaccess
文件配置 Rewrite 模块。
将目录更改为 DocumentRoot,在我们的例子中是 /var/www/html
:
cd /var/www/html
现在打开 .htaccess
进行编辑:
sudo vi .htaccess
当然,如果您之前没有创建过该文件,它将是空白的。 根据您要重定向的方向,使用以下选项之一。
选项 1:将 www 重定向到非 www
如果要将用户从 www 重定向到普通的非 www 域,请插入以下配置:
.htaccess — www 到非 www
RewriteEngine On RewriteBase / RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC] RewriteRule ^(.*)$ http://%1/$1 [R=301,L]
保存并退出。 更改应立即生效。 请注意,如果您使用的是 HTTPS,则应将 RewriteRule
行中的“http”更新为“https”。
使用此 curl 命令确保非 www 域重定向到 www 域(将突出显示的部分替换为您的实际域):
curl -I http://www.example.com
你应该得到一个 301 Moved Permanently
响应,显示非 www 重定向位置,如下所示:
Output:HTTP/1.1 301 Moved Permanently Date: Fri, 01 May 2015 21:18:33 GMT Server: Apache/2.4.7 (Ubuntu) Location: http://example.com/ Content-Type: text/html; charset=iso-8859-1
当然,您应该确保在网络浏览器(www 和非 www)中访问您的域。
选项 2:将非 www 重定向到 www
如果要将用户从普通的非 www 域重定向到 www 域,请插入以下配置:
.htaccess — 非 www 到 www
RewriteEngine On RewriteBase / RewriteCond %{HTTP_HOST} !^www\. [NC] RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]
保存并退出。 更改应立即生效。 请注意,如果您使用的是 HTTPS,则应将 RewriteRule
行中的“http”更新为“https”。
使用此 curl 命令确保非 www 域重定向到 www 域(将突出显示的部分替换为您的实际域):
curl -I http://example.com
你应该得到一个 301 Moved Permanently
响应,显示 www 重定向位置,如下所示:
Output:HTTP/1.1 301 Moved Permanently Date: Fri, 01 May 2015 21:18:33 GMT Server: Apache/2.4.7 (Ubuntu) Location: http://www.example.com/ Content-Type: text/html; charset=iso-8859-1
当然,您应该确保在网络浏览器(www 和非 www)中访问您的域。
结论
就是这样! 您的 Apache 重定向现在已正确配置,您的用户将能够通过您的非 www 和 www 域访问您的 Web 服务器。
如果您想了解更多关于 mod_rewrite(我们用来实现重定向的 Apache 功能)的信息,请随时阅读本教程:如何设置 Mod_Rewrite。