CentOS 7下Nginx配置www域名重定向到非www域名完整教程
简介
很多网站开发者需要允许用户通过www子域和根域名(非”www”部分)访问他们的网站或应用程序。也就是说,当访问www.my-website.com和my-website.com时,用户应该有相同的体验。虽然有很多设置方法,但对于SEO友好度最高的解决方案是选择您喜欢的域名——子域还是根域名,并让网页服务器将访问另一个域名的用户重定向到首选域名。
在这种情况下,有许多种HTTP重定向方式,但最好使用301重定向,它告诉客户端:”您所请求的网站已永久移动到另一个URL,请前往那里。”一旦浏览器从服务器接收到HTTP 301响应代码,它会向服务器发送第二个请求,请求新的URL,并向用户呈现网站,可能从未注意到它们被重定向过。
为什么不配置您的网站服务器,使得对这两个域名的请求都返回相同的网站?这样做可能更容易,但它无法带来301重定向的SEO优势。永久重定向告诉搜索引擎爬虫您的网站有一个主要的标准位置,并且这会提高该URL的搜索排名。
在本教程中,您将在CentOS 7上使用Nginx配置301重定向。如果您使用的是Apache而不是Nginx,请参考这个教程:如何在CentOS 7上使用Apache将www重定向到非www。
先决条件
要完成这个教程,你首先需要:
- 在运行Nginx的服务器上拥有超级用户权限(wheel组中的用户)。如果您尚未设置,请遵循本教程:CentOS 7初始服务器设置。
- 已安装并配置Nginx来为您的网站提供服务。请遵循本教程进行操作:如何在CentOS 7上安装Nginx。
- 一个已注册的域名。如果您还没有,可以从Freenom获取一个免费的域名。您可以使用任何您喜欢的DNS提供商(包括您的注册商)来托管您的域名记录——只需确保将您的注册商指向您提供商的名称服务器。如果您选择使用Silicon Cloud DNS,我们文档中的这篇文章展示了如何操作。
让我们开始配置您的DNS记录吧。
第一步:配置DNS记录
首先,你需要将www.my-website.com和my-website.com都指向运行Nginx的服务器。 (接下来的教程假设你的域名是my-website.com。请在下面的任何地方看到它时用你自己的域名替换它。)你可以通过为每个名称创建一个DNS A记录,将其指向Nginx服务器的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记录,在HOSTNAME字段中输入”www”,在WILL DIRECT TO字段中输入服务器的公共IP地址。
当你创建了这两个记录后,它应该看起来像这样:

有了这两个记录,对于my-website.com和www.my-website.com的网页请求都应该能够到达你的Nginx服务器。现在让我们配置这个服务器。
第二步 – 在Nginx中配置重定向
如前文所述,你应该已经在Nginx中配置好了你的网站。无论网站的服务器块是出现在主要的/etc/nginx/nginx.conf文件中还是在自己的文件中,都没关系。最重要的是,你要有一些配置好的服务器块,并将server_name指令设置为my-website.com和/或www.my-website.com。无论你的server_name包含一个还是两个名称,现在是决定将哪个名称作为唯一托管网站的名称的时候了。
打开包含您的网站配置的文件(例如,/etc/nginx/conf.d/my-website.com.conf)使用vi或您喜欢的编辑器(如果您喜欢,可以安装nano)并找到server_name指令。
- sudo vi /etc/nginx/conf.d/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而不是www.my-website.com。)
然后,创建一个名为/etc/nginx/conf.d/www.my-website.com.conf(或者如果您正在重定向的名称是my-website.com,则为/etc/nginx/conf.d/my-website.com.conf)的新的Nginx配置文件。您可以自行选择文件名,但是与所有Nginx配置文件一样,文件名必须以.conf结尾。
- sudo vi /etc/nginx/conf.d/www.my-website.com.conf
在文件中添加以下的服务器块,将my-website.com替换为您自己的域名。
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。
完成后,请保存并退出。
这将配置Nginx,使其向请求www.my-website.com的任何客户端发送301重定向,并将其重定向到my-website.com。重定向保留了请求的URI,因此对http://www.my-website.com/login.php的请求将被重定向到http://my-website.com/login.php。
注意
在应用更改之前,请检查您的Nginx配置是否没有错误。
- 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以应用新的重定向规则。
- sudo systemctl restart nginx
在使用浏览器访问www.my-website.com之前,请在您的服务器或本地机器上使用curl发送请求(如果本地已安装curl)。
- curl -IL http://www.my-website.com
-I选项告诉curl仅显示服务器响应中的标头。 -L选项告诉curl遵守服务器的重定向,自动发出第二个请求,这次请求的URL是在位置标头中给出的(就像一个网页浏览器一样)。由于您已配置了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服务器和位置块选择算法。