如何使用Nginx创建临时和永久重定向

介绍

HTTP重定向是将一个域或地址指向另一个域或地址的方式。有几种不同的重定向,每种重定向都意味着与客户端浏览器不同。两种最常见的类型是临时重定向和永久重定向。

如果临时需要从其他位置提供URL,则表示临时重定向(响应状态码**302 Found**)。例如,如果您正在执行网站维护,您可以使用从当前域到解释页面的临时重定向来通知您的访问者。

永久重定向(响应状态代码**301 Moved Permanently**)是指通知浏览器内容已永久移动到新位置上(例如更改域名时)。

您可以通过在服务器配置文件中的服务器块条目中添加这样的行来在Nginx中创建临时重定向:

rewrite \^/oldlocation\$ http://www.newdomain.com/newlocation redirect;

同样,使用这样的行进行永久重定向:

rewrite \^/oldlocation\$ http://www.newdomain.com/newlocation permanent;

本指南将更深入地介绍如何在Nginx中实现各种重定向,并针对特定用例进行一些示例。

准备

要学习本教程,您需要:

  • 安装了Nginx的一台服务器,并设置为使用服务器块为您的网站提供服务。您可以按照如何在Ubuntu 16.04,Debian或CentOS上设置Nginx服务器块(虚拟主机)来完成。

关于Nginx其他的功能,可以参考腾讯云Nginx 中文开发手册

解决方案一览

在Nginx中,您可以使用内置rewrite指令完成大多数重定向。默认情况下,此指令在新的Nginx安装中可用,可用于创建临时和永久重定向。在最简单的形式中,它至少需要两个参数:旧URL和新URL。

您可以在服务器配置中使用以下行实现临时重定向:

server {

. . .

server\_name www.domain1.com;

rewrite \^/\$ http://www.domain2.com redirect;

. . .}

此重定向指示浏览器将所有请求定向www.domain1.com到www.domain2.com。但是,此解决方案仅适用于单个页面,而不适用于整个站点。要重定向多个页面,可以使用rewrite带有正则表达式的指令来指定整个目录,而不仅仅是单个文件。

redirect匹配括号中的正则表达式模式。然后,它使用\$1表达式引用重定向目标中的匹配文本,其中1是第一组匹配文本。在更复杂的示例中,后续匹配的组按顺序给出数字。

例如,如果要暂时将每个页面重定向www.domain1.com到www.domain2.com,可以使用以下内容:

重写临时重定向

server {

. . .

server\_name www.domain1.com;

rewrite \^/(.\\*)\$ http://www.domain2.com/\$1 redirect;

. . .}

server {

. . .

server\_name www.domain2.com;

. . .}

默认情况下,该rewrite指令建立临时重定向。如果你想创建一个永久重定向,您可以通过在该指令结束处把redirect 换成 permanent,就像这样:

永久重定向

rewrite \^/\$ http://www.domain2.com permanent;
rewrite \^/(.\\*)\$ http://www.domain2.com/\$1 permanent;

让我们继续讨论一些具体的例子。

示例1 - 移动到不同的域

如果您已建立一个网络状态并希望将域名更改为新地址,则最好不要放弃旧域名。更改域名而不重定向会导致您的网站丢失以前访问者的流量。

在此示例中,我们从旧域domain1.com重定向到名为domain2.com的新域。我们将在此处使用永久重定向,因为旧域将被删除,并且所有流量应从现在开始进入新域。

假设您已将您的网站配置为已在Nginx中配置过的、从名叫domain1.com的单个域获取服务,如下所示:

/etc/nginx/sites-available/domain1.com

server {
. . .
server\_name domain1.com;
. . .}

我们还假设您已经在domain2.com以下网站提供未来版本的服务:

/etc/nginx/sites-available/domain2.com

server {
. . .
server\_name domain2.com;
. . .}

让我们更改domain1.com服务器块配置文件,将永久重定向添加到domain2.com:

/etc/nginx/sites-available/domain1.com

server {
. . .
server\_name domain1.com;
rewrite \^/(.\\*)\$ http://domain2.com/\$1 permanent;
. . .}

我们使用rewrite指令添加了上述重定向。在\^/(.\*)\$正则表达式后,匹配的一切在/之后的URL。例如,http://domain1.com/index.html将被重定向http://domain2.com/index.html。为了实现永久重定向,我们只需在rewrite指令后添加permanent。

注意:请记住在使用systemctl restart nginx进行配置更改后重新启动Nginx 。

示例2 - 网页名称改变,仍可访问正确网页

有时,更改已在网站上发布和接收流量的各个页面的名称是有必要的。只更改名称会导致尝试访问原始URL的访问者出现404 Not Found错误,但您可以通过使用重定向来避免这种情况。这可以确保为旧页面添加书签或通过搜索引擎上过时的链接找到它们的用户仍然可以访问正确的页面。

如果你的网站有产品和服务两个单独的页面,分别是products.html和services.html。现在,用一个名offers.html的页面替换这两个页面。我们将配置一个简单的重定向从products.html和services.html到offers.html。

我们假设您的网站配置如下:

server {
. . .
server\_name example.com www.example.com;
. . .}

配置重定向就像使用两个Redirect指令一样简单。

重定向已添加到原始配置中

server {
. . .
server\_name example.com www.example.com;
rewrite \^/products.html\$ /offer.html permanent;
rewrite \^/services.html\$ /offer.html permanent;
. . .}

该rewrite指令接受必须重定向的原始地址以及新页面的目标地址。由于此处的更改不是临时更改,因此我们在指令中使用permanent。您可以使用尽可能多的重定向,以确保访问者在移动网站内容时不会看到不必要的Not Found错误。

结论

您现在可以将请求重定向到新位置。请务必使用正确的重定向类型,因为不正确使用临时重定向可能会影响您的搜索排名。

HTTP重定向有多种其他用途,包括强制安全SSL连接(例如:使用https而不是http)和确保所有访问者最终只能www.访问网站的前缀地址。正确使用重定向将允许您保留当前的Web的同时,根据需要修改站点结构。

如果对网站的部署与发布感兴趣,可以参考腾讯云学院的网站建设教程


参考文献:《How To Create Temporary and Permanent Redirects with Nginx》

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏从零开始学自动化测试

python文档25-fixture的作用范围(scope)

fixture里面有个scope参数可以控制fixture的作用范围:session > module > class > function

1383
来自专栏云计算教程系列

如何使用Restic Backup Client将数据备份到对象存储服务

Restic是一个用Go语言编写,安全且高效的备份客户端。它可以将本地文件备份到许多不同的后端存储库,例如本地目录,SFTP服务器或对象存储服务。

2362
来自专栏黄日成的专栏

大话 Select、Poll、Epoll

提到select、poll、epoll相信大家都耳熟能详了,三个都是IO多路复用的机制,可以监视多个描述符的读/写等事件。

14.1K17
来自专栏WindCoder

ubuntu14.04下java安装及环境配置

这可以说是一篇迟到的文章,几个月前就说要写,结果拖到了现在。中间由于系统打不开等一系列原因,不得不重装了一遍,这次环境配置是出了点小问题,最后奉上。

2232
来自专栏编程

Go语言·不常用的Go命令详解

作者:孙飞撩技术 链接:http://www.jianshu.com/p/46c268e7a149 來源:简书 共3329字,阅读需8分钟 迁移自CSDN: $...

2465
来自专栏小车博客

OpenVZ 魔改 BBR - lkl-rinetd 一键脚本

2521
来自专栏java一日一条

Java EE7和Maven工程入门(2)

我们已经建立了父pom文件。这种特殊类型的文件用来定义我们项目即将使用的类库,它也配置了所有为了打包项目的每个模块而使用的maven工具。你可以检出第一部分代码...

832
来自专栏玩转JavaEE

Git分支管理

Svn中也有分支管理,但是很low,Git的分支管理非常强大,本文先不去说分支管理内部到底怎么做的,我们先来看看Git中最基本的分支管理操作。 本文是Git系列...

3865
来自专栏Python研发

五分钟学会centos配置gitlab

修改gitlab配置文件,访问IP:端口,   如果不修改默认80端口,进入文件之后,找到

1203
来自专栏北京马哥教育

Linux中find命令用法全汇总,看完就没有不会用的!

Linux 查找命令是Linux系统中最重要和最常用的命令之一。查找用于根据与参数匹配的文件指定的条件来搜索和查找文件和目录列表的命令。查找可以在各种条件下使用...

1874

扫码关注云+社区