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

简介

很多网页开发者需要让用户通过www子域名和根(非www)域名访问他们的网站或应用程序。换句话说,用户在访问www.my-website.com和my-website.com时应有相同的体验。虽然有许多方法可以设置这个,但最符合SEO标准的解决方案是选择你更喜欢的域名——子域名或根域名,并且让网页服务器将访问另一个域名的用户重定向到首选域名。

在这种情况下,有很多种HTTP重定向。但最好使用301重定向,这告诉客户端:“您请求的网站已永久移动到另一个URL,请前往那里。”一旦浏览器从服务器接收到HTTP 301响应代码,它会向服务器发送第二个请求以获取新的URL,并向用户展示网站,可能根本没有意识到自己被重定向了。

为什么不配置你的web服务器,使得对于这两个域名的请求都只提供同一个网站呢?这样做可能会更容易,但它没有301重定向的SEO优点。永久重定向告诉搜索引擎爬虫,你的网站有一个规范位置,从而提高该URL的搜索排名。

在本教程中,您将使用CentOS 7上的Apache配置301重定向。如果您使用的是Nginx而不是Apache,请参考此教程:如何在CentOS 7上使用Nginx将www重定向到非www。

先决条件

完成这个教程,首先你需要:

  • Superuser privileges on the server that is running Apache. If you don’t already have that set up, follow our Initial Server Setup with CentOS 7 guide.
  • Apache installed and configured to serve your website. Follow this tutorial to do that: How to Install the Apache Web Server on CentOS 7.
  • A registered domain name. If you don’t have one yet, you can get a free one from Freenom. You may use whatever DNS provider you like (including your registrar) to host your domain’s records—just make sure to point your registrar to your provider’s nameservers. If you opt to use Silicon Cloud DNS, this article from our documentation shows how to do that.

让我们开始配置你的DNS记录吧。

第一步 – 配置DNS记录

首先,您需要将www.my-website.com和my-website.com都指向您运行Apache的服务器。 (以下教程的其余部分假设您的域名是my-website.com。请在下面看到该域名时替换为您自己的域名。)您可以通过为每个名称创建一个DNS A记录来实现这一点,该记录将指向您Apache服务器的IP地址。

打开你的 DNS 供应商的网页控制台。本教程使用的是 Silicon Cloud DNS。

在添加域名表单中,将您注册的域名输入到文本框中,然后点击添加域名。这将打开新域名的页面,您可以在该页面上查看、添加和删除该域名的记录。

在创建新记录中,在HOSTNAME文本字段中输入“@”。这是一个特殊字符,表示您正在为根域名添加记录,即只是my-website.com的记录。在WILL DIRECT TO文本字段中,输入您服务器的公共IPv4地址,然后点击创建记录即可。(无需更改TTL。)

对于您的第二个DNS记录,您可以使用CNAME记录而不是A记录。CNAME记录是指向另一个名称而不是IP地址的别名。您可以创建一个CNAME记录,将www.my-website.com指向my-website.com,任何针对www子域名的HTTP请求都将找到您的服务器,因为您刚刚为根域名创建了A记录。但为了简单起见,您只需创建另一个与第一个一样的A记录,将“www”输入到主机名字段,将服务器的公共IP地址输入到将定向至字段。

当你创建了这两条记录后,它应该看起来像这样:

Required A records

现在,有了这两个记录,无论是针对my-website.com的网络请求还是针对www.my-website.com的网络请求都应该能够到达你的Apache服务器。现在让我们来配置服务器。

第二步 – 在Apache中配置重定向

Apache Web Server提供了两个模块来帮助您配置重定向:mod_alias和mod_rewrite。尽管mod_rewrite更强大,但mod_alias更易于理解和使用。例如,如果您需要重定向包含特定查询字符串或HTTP头的请求,就需要使用mod_rewrite。许多人选择mod_rewrite是因为它具有正则表达式匹配的功能,而mod_alias则没有。但是,对于将所有www.my-website.com的请求重定向到my-website.com的简单情况,mod_alias就足够了。(Apache本身建议在可能的情况下选择mod_alias,称选择mod_rewrite而不必要的话“会导致配置混乱、脆弱且难以维护”。)

默认情况下,CentOS 7应该启用此模块,但为了确保,请运行以下命令进行检查。

  1. httpd -M | grep alias_module

如果输出中出现了 alias_module (shared),则表示该模块已启用。如果没有出现,请在 /etc/httpd/conf.modules.d/00-base.conf 中添加以下行以启用该模块。

  1. echo “LoadModule alias_module modules/mod_alias.so” | sudo tee -a /etc/httpd/conf.modules.d/00-base.conf

启用mod_alias后,在Apache配置中可以使用重定向(Redirect)、重定向匹配(RedirectMatch)以及mod_alias文档中列出的其他指令。

现在让我们配置你的虚拟主机。

根据前提条件,你应该已经在Apache中配置了你的网站。它可以配置在主要的Apache配置文件(/etc/httpd/conf/httpd.conf)中,或者可能在自己的文件中(例如,/etc/httpd/conf.d/my-website.com.conf)。如果你使用前提条件中链接的Apache安装指南来配置你的虚拟主机,它可能在一个类似于/etc/httpd/sites-available/my-website.com.conf的文件中。无论你的主站点是在哪里配置的,用vi或你最喜欢的编辑器打开那个文件(如果你喜欢,可以yum install nano)。

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

在虚拟主机中查找任何设置了ServerAlias指令的内容。如果找到一行内容中ServerAlias被设置为www.my-website.com,请删除这行。 (或者,如果该行中包含多个逗号分隔的别名,则仅从列表中删除www.my-website.com。)您需要删除此别名,因为您将为子域创建一个单独的虚拟主机,其中只包含ServerName和Redirect指令。该站点的主要虚拟主机将不再为www.my-website.com的请求提供服务。

现在,在一个单独的文件中创建一个虚拟主机(例如:/etc/httpd/conf.d/www.my-website.com.conf)。

  1. sudo vi /etc/httpd/conf.d/www.my-website.com.conf

将以下内容粘贴到文件中,将my-website.com替换为您自己的域名:

/www.my-website.com.conf文件位于/etc/httpd/conf.d/目录下。
<VirtualHost *:80>
    ServerName www.my-website.com
    Redirect permanent / http://my-website.com/
</VirtualHost>

当你完成后,保存并退出。如果你在/etc/httpd/sites-available创建了这个文件,依照我们的Apache安装指南,在/etc/httpd/sites-enabled/内创建一个符号链接到这个文件。

  1. sudo ln -s /etc/httpd/sites-available/www.my-website.com.conf /etc/httpd/sites-enabled/

这个新的VirtualHost配置Apache发送一个301重定向回给任何请求www.my-website.com的客户端,引导他们访问my-website.com。该重定向保留请求的URI,因此对http://www.my-website.com/login.php的请求将被重定向到http://my-website.com/login.php。

Note

注意:如果您网站的主要虚拟主机包含一个带有通配符子域的ServerAlias — *.my-website.com — 您应该考虑删除它,并为您想要重定向的每个子域创建一个新的虚拟主机,就像您刚刚创建的那个一样。如果您不想重定向所有子域,并且需要保持其中一些子域由主要的虚拟主机提供服务,最好明确命名每个子域作为别名,特别是现在您有一个您不希望意外匹配到主要虚拟主机的子域的请求。 (您可以在自己的ServerAlias行上为每个子域命名,或者将它们全部作为逗号分隔的列表在一个ServerAlias行上命名。)
如果必须保留ServerAlias用于 *.my-website.com,则需要确保Apache在加载主要虚拟主机之前加载新的www虚拟主机,因为如果先加载主要虚拟主机,则Apache将使用它来处理 www.my-website.com 的请求,因为该名称与通配符别名匹配。重新启动Apache后运行以下命令查看将加载哪个虚拟主机:
httpd -S

查找包含 namevhost my-website.com 和 namevhost www.my-website.com 的行。如果 www 行首先出现,那么一切都设置好了。然而,如果根域的虚拟主机首先出现,则有几种方法可以使Apache首先加载www虚拟主机:

如果您的主要虚拟主机包含在一个文件中(例如/etc/httpd/conf/httpd.conf),该文件使用Include或IncludeOptional指令包含包含新的www虚拟主机的目录,请将该Include行移动到文件中的主要虚拟主机之前。
如果您的主要虚拟主机和新的www虚拟主机文件包含在同一个目录中(例如,/etc/httpd/conf.d/),您可以通过在文件名之前加上一些数字来强制Apache首先加载www虚拟主机。将01-添加到www虚拟主机的文件名之前(例如,/etc/httpd/conf.d/ 01-www.my-website.com.conf),并在主要虚拟主机的文件名之前添加02-(例如,/etc/httpd/conf.d/ 02-my-website.com.conf)。

再次运行httpd -S以确保www虚拟主机首先出现。

当你准备好了,重新启动Apache。

  1. sudo systemctl restart httpd

在浏览器中访问www.my-website.com之前,可以使用curl在服务器或本地机器上发送请求(如果本地已安装curl)。

  1. curl -IL http://www.my-website.com

使用-I标志告诉curl仅展示服务器响应的头部信息。使用-L标志告诉curl遵循服务器的重定向,自动发起第二个请求,这次请求的URL由Location头部中给定的地址确定(就像一个网页浏览器会做的那样)。由于你配置了301重定向,curl应该会发起两次请求,你应该只能看到这两个响应的头部信息。

Output
HTTP/1.1 301 Moved Permanently Date: Tue, 03 Jan 2023 19:24:44 GMT Server: Apache/2.4.53 Location: http://my-website.com/ Content-Type: text/html; charset=iso-8859-1 HTTP/1.1 200 OK Date: Tue, 03 Jan 2023 19:24:44 GMT Server: Apache/2.4.53 Last-Modified: Thu, 01 Dec 2022 22:10:57 GMT ETag: "39-5eecb7ed6bfc9" Accept-Ranges: bytes Content-Length: 57 Content-Type: text/html; charset=UTF-8

在对http://www.my-website.com的原始请求的301(永久移动)响应中,请注意倒数第二个头部信息:Location: http://my-website.com。第二个响应是由curl对该Location头部指定的URL的跟进请求产生的,如果您的网站正常,则服务器应该以200(正常)作为响应。

最后,在您的网络浏览器中访问http://www.my-website.com。眨眼之间,您可能会错过重定向。您的网站应该像往常一样显示,但再次查看地址栏,注意到URL中不再有“www”。大多数用户都不会注意到这一点,所以他们会有与请求http://my-website.com相同的体验。

结论

在这个教程中,你为你的网站添加了两个DNS记录,并配置了Apache服务器将次要域名重定向到首选域名。现在你的网站可以通过这两个域名访问。也许在阅读本教程之前,你的网站已经能够通过这两个域名直接提供服务了。但是只需再进行四行Apache配置,你就能提高你的网站在搜索引擎中的地位,并因此将它展示给更多的互联网用户。

想了解更强大的mod_rewrite模块吗?请查看我们的教程《如何使用mod_rewrite在Ubuntu 22.04上重写URL》。

发表回复 0

Your email address will not be published. Required fields are marked *