Ubuntu系统Nginx配置教程:将www域名重定向到非www的完整指南

介绍

许多网络开发人员需要允许用户通过www子域和根域名(非www)访问他们的网站或应用程序。也就是说,用户在访问www.my-website.com和my-website.com时应有相同的体验。虽然有很多设置方法,但最符合SEO要求的解决方案是选择您偏好的域名——子域名或根域名——并让Web服务器将访问另一个域名的用户重定向到首选的域名。

在这种情况下,有许多种HTTP重定向,但最好使用301重定向。301重定向告诉客户端:”您所请求的网站已永久移动到另一个URL,请前往那个URL。”一旦浏览器从服务器接收到HTTP 301响应代码,它会向服务器发送第二个请求,然后用户将展示该网站,可能很少注意到他们被重定向了。

为什么不在你的网页服务器上进行配置,使得针对这两个域名的请求都返回同一个网站呢?这样或许会更简单,但却无法获得 301 重定向的 SEO 优势。永久重定向会告诉搜索引擎爬虫,你的网站有一个规范的唯一位置,从而提高该 URL 的搜索排名。

在这个教程中,你将会在Ubuntu 14.04上使用Nginx配置一个301重定向。如果你使用的是Apache而不是Nginx,请参考这个教程:在Ubuntu 14.04上如何使用Apache将www重定向到非www。

先决条件

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

  • 运行Nginx的服务器上的超级用户权限(sudo组中的用户)。如果您尚未设置,请按照本教程操作:Ubuntu 14.04初始服务器设置。
  • 已安装并配置Nginx来为您的网站提供服务。请按照本教程进行操作:如何在Ubuntu 14.04上安装Nginx。另请阅读:如何在Ubuntu 14.04 LTS上设置Nginx服务器块(虚拟主机)。
  • 一个已注册的域名。如果您还没有域名,可以从Freenom获取一个免费域名。您可以使用任何您喜欢的DNS提供商(包括您的域名注册商)来托管您的域名记录—只需确保将您的域名注册商指向提供商的名称服务器。如果您选择使用Silicon Cloud DNS,我们文档中的这篇文章展示了如何操作。

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

第一步-配置DNS记录

首先,您需要将www.my-website.com和my-website.com指向运行Nginx的服务器。 (以下教程的其余部分假设您的域名为my-website.com。在下面任何出现的地方,将其替换为您自己的域名。)您可以通过为每个名称创建一个DNS A记录,并将其指向您的Nginx服务器的IP地址来完成这一步骤。

打开你的DNS提供商的Web控制台。本教程使用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”输入到HOSTNAME字段,将服务器的公共IP地址输入到WILL DIRECT TO字段中。

当你已经创建了两个记录,它应该看起来像这样:

Required A records

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

第二步——在Nginx中配置重定向

如先决条件所述,您应该已经在Nginx中配置好了您的网站。无论该网站的服务器块是出现在主要的/etc/nginx/sites-enabled/default文件中还是在其自己的文件中都无关紧要。重要的是,您需要配置一些服务器块,并将server_name指令设置为my-website.com和/或www.my-website.com。无论您的server_name包含一个名称还是两个名称,现在是决定哪个名称将成为唯一的用于托管该网站的名称的时候了。

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

  1. sudo nano /etc/nginx/sites-available/my-website.com.conf
我的网站配置文件位于/etc/nginx/sites-available/my-website.com.conf。
server {
    . . .
    server_name my-website.com www.my-website.com
    . . .
}

如果你想要将www.my-website.com重定向到my-website.com,请从server_name行中移除www.my-website.com,保存并退出文件。(如果你想要将my-website.com重定向到www.my-website.com,反而需要移除my-website.com。)

之后,创建一个名为/etc/nginx/sites-available/www.my-website.com.conf(如果你要重定向的名字是my-website.com,则创建/etc/nginx/sites-available/my-website.com.conf文件)的新的Nginx配置文件。文件名可以任意命名,但是和所有的Nginx配置文件一样,文件名必须以.conf结尾。

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

在文件中添加以下服务器块,并用自己的域名替换my-website.com。

/www.my-website.com.conf 这个文件位于 /etc/nginx/sites-available 目录下。
server {
    server_name www.my-website.com;
    return 301 $scheme://my-website.com$request_uri;
}

如果你把my-website.com重定向到www子域名,那么在server_name中只需写入my-website.com,在下一行的URL中写入www.my-website.com。

完成后保存并退出。然后在/etc/nginx/sites-enabled下创建一个符号链接指向这个新文件,这样在重新启动Nginx后,它就能加载它。

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

这将配置 Nginx,在任何客户设备请求 www.my-website.com 时,发送一个301重定向,并指示他们访问 my-website.com。重定向会保留请求URI,因此对 http://www.my-website.com/login.php 的请求将被重定向到 http://my-website.com/login.php。

注意

注意:上面的服务器块中不包含listen指令。这没问题,因为如本教程所述,任何没有listen指令的服务器块将会监听0.0.0.0:80(所有接口的80端口)。但是如果你的Nginx服务器有多个IP地址,或者你的网站监听的端口不是80,你可能需要添加一个listen指令来说明具体的IP地址和端口。使用与您网站的主服务器块相同的listen值。

在应用更改之前,请确保您的Nginx配置没有错误。

  1. sudo nginx -t

除非你犯了语法错误(例如忘了分号),否则配置应该是正常的。

输出
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

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

  1. sudo service nginx restart

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

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

-I标志告诉curl仅显示来自服务器响应的标头。-L标志告诉curl遵循服务器的任何重定向,通过自动发出第二个请求,这次请求的URL在Location标头中给出(就像网页浏览器一样)。由于您已配置301重定向,curl应发出两个请求,并且您只能看到两个响应的标头。

输出
HTTP/1.1 301 Moved Permanently
Server: nginx/1.20.1
Date: Thu, 08 Dec 2022 19:24:44 GMT
Content-Type: text/html
Content-Length: 169
Connection: keep-alive
Location: http://my-website.com

HTTP/1.1 200 OK
Server: nginx/1.20.1
Date: Thu, 08 Dec 2022 19:24:44 GMT
Content-Type: text/html
Content-Length: 57
Last-Modified: Thu, 01 Dec 2022 22:10:57 GMT
Connection: keep-alive
ETag: "63892671-39"
Accept-Ranges: bytes

在对http://www.my-website.com的原始请求进行301(永久移动)响应中,请注意最后一个头部:Location: http://my-website.com。第二个响应是curl对http://my-website.com的跟进请求,如果您的网站健康,则服务器应以200(正常)做出响应。

最后,在您的网络浏览器中访问 http://www.my-website.com。眨眼之间,重定向就会发生。您的网站应该会正常显示,但请再次查看地址栏,注意到URL中缺少了”www”。大多数用户都不会察觉到这一点,因此他们将会和请求了http://my-website.com 一样有相同的体验。

结论

在这个教程中,您为您的网站添加了两个DNS记录,并配置了Nginx将二级域名重定向到首选域名。现在您的网站可以通过这两个域名访问。也许在您阅读本教程之前它已经可以通过这两个域名直接访问。但是通过仅仅四行Nginx配置,您已经提升了您网站在搜索引擎中的地位,并因此使其暴露给更多互联网用户。

想要了解更多关于Nginx如何决定哪个服务器块来处理特定请求的内容吗?请阅读这篇指南:《了解Nginx服务器和位置块选择算法》。

bannerAds