如何在Ubuntu14.04上使用Apache将www重定向到非www

来自菜鸟教程
跳转至:导航、​搜索

介绍

当您的网站或应用程序在域后面启动并运行时,通常还希望允许您的用户通过普通域名 访问它 www 子域。 也就是说,无论有没有“www”,他们都应该能够访问您的域。 前缀,例如 example.comwww.example.com,在 Web 浏览器中显示相同的内容。 虽然有多种设置方法,但出于一致性和 SEO 考虑的最佳解决方案是选择您喜欢的域,普通域或 www,然后将另一个重定向到首选域。 这种类型的重定向称为 永久重定向 或“301 重定向”,可以通过正确配置 DNS 资源记录和 Web 服务器软件轻松设置。

本教程将向您展示如何将 www URL 重定向到非 www,例如 www.example.comexample.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.comexample.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