如何在 Ubuntu 14.04 上使用 Nginx 将 www 重定向到非 www

介绍

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

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

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

在本教程中,您将使用Ubuntu 14.04上的Nginx配置301重定向,如果您正在运行Apache而不是Nginx,请参阅本教程: 如何使用Ubuntu 14.04上的Apache重定向www到非www

前提条件

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

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

步骤 1 – 配置 DNS 记录

首先,您需要将www.my-website.commy-website.com指向运行 Nginx 的服务器(教程的其余部分假定您的域名是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的网页请求都应该到达您的 Nginx 服务器。

步骤 2 — 在 Nginx 中配置重定向

如前提所述,您应该已经在 Nginx 中配置了您的网站,无论该网站的服务器块是否出现在主文件中或在自己的文件中,都无关紧要。重要的是,您有一些服务器块配置了服务器名称指令,设置为我的网站.com和/或www.my-website.com

nano或您最喜欢的编辑器中打开包含您的网站配置的文件(例如, /etc/nginx/sites-available/my-website.com.conf)并找到 server_name 指令:

1sudo nano /etc/nginx/sites-available/my-website.com.conf
1[label /etc/nginx/sites-available/my-website.com.conf]
2server {
3    . . .
4    server_name my-website.com www.my-website.com
5    . . .
6}

如果您想將「www.my-website.com」重定向至「my-website.com」,請從「server_name」行移除「www.my-website.com」,然後儲存並退出檔案(如果您要將「my-website.com」重定向至「www.my-website.com」,請移除「my-website.com」。

然后,创建一个新的 Nginx 配置文件,名为 /etc/nginx/sites-available/www.my-website.com.conf(或 /etc/nginx/sites-available/my-website.com.conf,如果这是您正在重定向的名称)。

1sudo nano /etc/nginx/sites-available/www.my-website.com.conf

将以下服务器块添加到文件中,以自己的域名取代my-website.com:

1[label /etc/nginx/sites-available/www.my-website.com.conf]
2server {
3    server_name www.my-website.com;
4    return 301 $scheme://my-website.com$request_uri;
5}

如果您正在将my-website.com重定向到 www 子域,则只将my-website.com放入server_name,而www.my-website.com放入下一行URL。

当你完成时,保存和退出,然后在/etc/nginx/sites-enabled中创建一个对这个新文件的同步链接,以便 Nginx 在重新启动后接收它:

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

这将 Nginx 配置为将 301 重定向发送回任何要求 www.my-website.com 的客户端,并指示他们访问 www.my-website.com 而不是 www.my-website.com。 重定向保留了请求 URI,因此对 www.my-website.com/login.php 的请求将被重定向到 http://my-website.com/login.php

<$>[注] 注: 上面的服务器区块不包含倾听指令,这是正常的,因为正如在 本教程中提到的,没有倾听指令的任何服务器区块会倾听0.0.0:80(所有界面上的端口80)。但是,如果您的Nginx服务器拥有多个IP地址,或者您的网站倾听在80以外的端口,您可能需要添加一个倾听指令来拼写特定IP地址和端口。使用您网站的主要服务器区块使用的倾听的相同值。

在应用这些更改之前,请检查您的 Nginx 配置是否没有错误:

1sudo nginx -t

除非您犯了语法错误(例如,您忘记了半色),否则配置应该是OK。

1[secondary_label Output]
2nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
3nginx: configuration file /etc/nginx/nginx.conf test is successful

现在重新启动 Nginx 以应用新的重定向规则:

1sudo service nginx restart

在浏览器中访问 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
 3Server: nginx/1.20.1
 4Date: Thu, 08 Dec 2022 19:24:44 GMT
 5Content-Type: text/html
 6Content-Length: 169
 7Connection: keep-alive
 8Location: http://my-website.com
 9
10HTTP/1.1 200 OK
11Server: nginx/1.20.1
12Date: Thu, 08 Dec 2022 19:24:44 GMT
13Content-Type: text/html
14Content-Length: 57
15Last-Modified: Thu, 01 Dec 2022 22:10:57 GMT
16Connection: keep-alive
17ETag: "63892671-39"
18Accept-Ranges: bytes

在 301 (永久移动) 响应原来的请求到 http://www.my-website.com,注意最后一个标题: 位置: http://my-website.com. 第二个响应是从 curl 的追踪请求到 http://my-website.com,如果你的网站是健康的,服务器应该回答 200 (OK)。

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

结论

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

想要进一步阅读 Nginx 如何决定哪个服务器块将处理给定的请求? 查看本指南: 理解 Nginx 服务器和位置块选择算法

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