介绍
许多网页开发人员需要允许用户通过 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.com
和my-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字段中。
当您创建两个记录时,它应该看起来像这样的东西:
有了这两个记录,对于my-website.com
和www.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
,其中只包含ServerName
和Redirect
。
现在在一个单独的文件中创建一个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 行出現第一個,你已經設定了。
- 如果你的主要
VirtualHost
包含在一个文件中(例如:/etc/httpd/conf/httpd.conf)使用Include
或IncludeOptional
指令来包含包含你的新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。