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

介绍

许多网页开发人员需要允许用户通过 www 子域和 root (非 www ) 域访问他们的网站或应用程序,也就是说,用户在访问 www.my-website.com 和 my-website.com 时应该有相同的体验。

有许多类型的HTTP重定向,但在这种情况下,最好使用301重定向,它告诉客户端,`您请求的网站已经永久移动到另一个URL。

为什么不配置您的网页服务器只为向两个域名的请求提供相同的网站?这可能看起来更容易,但它不会赋予301重定向的SEO优点。

在本教程中,您将使用 CentOS 7 上的 Apache 配置 301 重定向。如果您正在运行 Nginx 而不是 Apache,请参阅本教程: How To Redirect www to Non-www with Nginx on CentOS 7

前提条件

要完成本教程,您首先需要:

*超级用户权限在运行Apache的服务器上。如果您尚未安装此设置,请遵循我们的 初始服务器设置与CentOS 7指南。

  • Apache安装并配置以服务您的网站。 按照本教程来做: 如何在CentOS 7上安装Apache Web Server
  • 注册域名. 如果您尚未注册,您可以从 Freenom获得免费的域名。 您可以使用任何您喜欢的DNS提供商(包括您的注册商)来托管您的域名记录 — 只要确保将您的注册商指向您的提供商的名称服务器。 如果您选择使用DigitalOcean DNS, [我们的文档中的本文]([L

让我们从配置您的DNS记录开始。

步骤 1 – 配置 DNS 记录

首先,您需要将www.my-website.commy-website.com指向运行Apache的服务器(教程的其余部分假定您的域名是my-website.com

打开您的 DNS 提供商的 Web 控制台。本教程使用 DigitalOcean DNS

添加域名表格中,在文本字段中输入您的注册域名,然后单击添加域名这将带来新域的页面,您可以查看,添加和删除该域的记录。

创建新记录下,在 HOSTNAME文本字段中键入@。这是一个特殊字符,表示您正在为根域名添加一个记录,一个记录仅仅是my-website.com。在 WILL DIRECT TO文本字段中,输入您的服务器的公共IPv4地址,然后单击 Create Record

对于你的第二个 DNS 记录,你可以使用一个 CNAME 记录而不是一个 A 记录. CNAME 记录是指向另一个名称而不是 IP 地址的代名词. 你可以创建一个 CNAME 将 www.my-website.com 引导到 my-website.com,而 www 子域的任何 HTTP 请求都会找到你的服务器,因为你刚刚为根域创建了 A 记录. 但要保持事情简单,只需创建另一个 A 像第一个记录,在 HOSTNAME 字段中输入www和服务器的公共 IP 地址在 WILL DIRECT TO字段中。

当您创建两个记录时,它应该看起来像这样的东西:

Required A records

有了这两个记录,对于my-website.comwww.my-website.com的网页请求都应该到达你的Apache服务器。

步骤 2 – 在 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,_modalias会这样做。

默认情况下,该模块应该在CentOS 7上启用,但要进行双重检查,请运行以下命令:

1httpd -M | grep alias_module

如果alias_module (shared) 显示在输出中,则该模块已启用,否则,请将此行附加到/etc/httpd/conf.modules.d/00-base.conf:

1echo “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文件中列出的指令(https://httpd.apache.org/docs/2.4/mod/mod_alias.html)。

现在,让我们配置您的VirtualHost

如前提所述,您应该已经在Apache中配置了您的网站,它可以配置在主Apache配置文件中(/etc/httpd/conf/httpd.conf)或可能在自己的文件中(例如, /etc/httpd/conf.d/my-website.com.conf)。 如果您使用了在前提中链接的Apache安装指南(https://andsky.com/tech/tutorials/how-to-install-the-apache-web-server-on-centos-7)来配置您的VirtualHost,它可能位于类似的文件中,如 /etc/httpd/sites-available/my-website.com.conf。 无论您的主站点配置在何处,请在‘vi’或您喜爱的编辑器中打开该文件(如果您喜欢的话,请安装nano):

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

如果你找到一个有ServerAlias设置为www.my-website.com的行,删除该行(或者,如果该行包含多个副名称在一个单独的列表中,只从列表中删除www.my-website.com)你需要删除这个副名称,因为你将为子域创建一个单独的VirtualHost,其中只包含ServerNameRedirect

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

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

将以下内容粘贴到文件中,以自己的域名取代my-website.com:

1[label /etc/httpd/conf.d/www.my-website.com.conf]
2<VirtualHost *:80>
3    ServerName www.my-website.com
4    Redirect permanent / http://my-website.com/
5</VirtualHost>

如果您在/etc/httpd/sites-available中创建了此文件,根据我们的 Apache 安装指南,在`/etc/httpd/sites-enabled/``中创建一个对文件的 symlink:

1sudo 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

注意:如果您的网站的主要VirtualHost包含一个ServerAlias带有 wildcard子域――My-website.com――你应该考虑删除它并创建一个新的VirtualHost,就像你刚刚为您想要重定向的每个子域创建的那样。如果您不想重定向所有子域,并且需要其中的一些域继续由主VirtualHost服务,最好将每个子域命名为名称,特别是现在您有一个子域,其请求不愿意外匹配到主VirtualHost

如果你必须将ServerAlias保留在*.my-website.com,你需要确保Apache在主网站之前加载新的www.VirtualHost,因为如果主网站首先加载,Apache将使用它来处理www.my-website.com的请求,因为这个名称匹配了野卡名称。

1httpd -S

尋找包含「namevhost my-website.com」和「namevhost www.my-website.com」的行,如果 www 行出現第一個,你已經設定了。

  1. 如果你的主要VirtualHost包含在一个文件中(例如:/etc/httpd/conf/httpd.conf)使用IncludeIncludeOptional指令来包含包含你的新wwwVirtualHost的目录,只需将Include行移动到文件中的主要VirtualHost上面。 2 如果你的主要VirtualHost和你的新wwwVirtualHost文件包含在同一个目录中(例如: etc/http/conf.d/conf.d/),你可以强迫Apache先通过重命名文件并预先给文件名称一些号码来加载www。

再次运行httpd -S以确保 www VirtualHost 首先出现。

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

1sudo systemctl restart httpd

在浏览器中访问 www.my-website.com 之前,请在您的服务器或本地计算机上使用curl进行请求(如果curl在本地安装):

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

-I旗说curl只显示服务器响应的标题。-L旗说curl服从服务器的任何重定向,自动提出第二个请求,这一次是给出的位置标题的URL(就像网页浏览器一样)。

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

在 301 (永久移动) 响应原来的请求到 http://www.my-website.com,注意第二到最后的标题: 位置: http://my-website.com

最后,在您的 Web 浏览器中访问 http://www.my-website.com 点击,您将错过重定向. 您的网站应该像往常一样显示,但再次查看您的地址栏,并注意到www在URL中没有。 大多数用户将永远不会注意到这一点,所以他们将有相同的体验,如果他们已经要求 http://my-website.com

结论

在本教程中,您为您的网站添加了两个 DNS 记录,并配置了 Apache 将次域重定向到您偏好的域。现在您的网站可以通过两个域访问。也许在您阅读本教程之前就已经存在了;也许您正在直接从两个域名服务。

对更强大的mod_rewrite模块有兴趣吗? 查看我们的教程 如何在Ubuntu 22.04上使用mod_rewrite重写URL

Published At
Categories with 技术
Tagged with
comments powered by Disqus