如何在CentOS7上使用Apache将www重定向到非www

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

介绍

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

本教程将向您展示如何将 www URL 重定向到非 www,例如 www.example.comexample.com,在 CentOS 7 上使用 Apache。 我们还将向您展示如何从非 www 的 URL 重定向到 www。 本教程的 Ubuntu 14.04 版本可在 此处 获得。

如果你想用 Nginx 作为你的 web 服务器来执行这种类型的重定向,你应该遵循这个教程:How to Redirect www to non-www with Nginx on CentOS 7

先决条件

本教程假设您拥有超级用户权限,即 sudo 或 root,在运行 Apache 的服务器上。 如果您还没有设置,请按照本教程进行操作:CentOS 7 上的初始服务器设置。

假设您已安装 Apache (httpd)。 如果您还没有这个设置,在 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 域访问,但我们仍然需要设置重定向。 我们现在就这样做。

启用 Apache 重写模块

为了执行 301 重定向,我们将使用 Apache mod_rewrite 或 Rewrite 模块。 这样做将确保您的用户可以使用或不使用 www. 前缀访问您的站点,并被重定向到您喜欢的域。

CentOS 7 上的 Rewrite 模块默认启用。 如果由于某种原因未启用,请务必将此行添加到 Apache 配置的模块部分(默认情况下在 /etc/httpd/conf.modules.d/00-base.conf 中):

LoadModule rewrite_module modules/mod_rewrite.so

启用 .htaccess 文件

我们将使用 .htaccess 文件为 Apache 配置重定向规则。 这是一项必须通过放宽 DocumentRoot 的目录权限来启用的功能。

打开 Apache 配置文件进行编辑。 在 CentOS 上,默认配置文件位于 /etc/httpd/conf/httpd.conf,因此我们将在示例中使用它:

sudo vi /etc/httpd/conf/httpd.conf

假设您使用的是默认 DocumentRoot,/var/www/html,找到对应的配置块,<directory "/var/www/html>。 在块中,将 AllowOverride None 更改为 AllowOverride All

添加到 Apache 配置

 <Directory /var/www/html>
...
    AllowOverride All
...
 </Directory>

保存并退出。

现在重新启动 Apache 以使更改生效:

sudo systemctl restart httpd

现在 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: Mon, 04 May 2015 16:04:56 GMT
Server: Apache/2.4.6 (CentOS)
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: Mon, 04 May 2015 16:05:26 GMT
Server: Apache/2.4.6 (CentOS)
Location: http://www.example.com/
Content-Type: text/html; charset=iso-8859-1

当然,您应该确保在网络浏览器(www 和非 www)中访问您的域。

结论

就是这样! 您的 Apache 重定向现在已正确配置,您的用户将能够通过您的非 www 和 www 域访问您的 Web 服务器。

如果您想了解更多关于 mod_rewrite(我们用来实现重定向的 Apache 功能)的信息,请随时阅读本教程:如何设置 Mod_Rewrite