如何在nginx中应用常见的rewrite规则?

avatar
作者
猴君
阅读量:0
Nginx的rewrite规则用于重写URL,常见语法是rewrite 正则表达式 替换目标 [flag]rewrite ^/old-page$ /new-page.html permanent;将永久重定向旧页面到新页面。

nginx的常见rewrite规则讲解和示例

如何在nginx中应用常见的rewrite规则?

rewrite介绍

rewrite功能主要用于实现URL重写和重定向,它与location功能类似,但主要区别在于rewrite常用于同一域名内更改获取资源的路径,而location是对一类路径进行控制访问和反向代理,Nginx的Rewrite规则采用PCRE(Perl兼容正则表达式)语法,需要编译安装PCRE库才能使用。

rewrite作用及应用场景

作用

实现对URL的重写和匹配(正则表达式)的URL重定向。

根据变量来做URL转向及选择配置。

应用场景

URL访问跳转:页面跳转、兼容性支持、展示效果。

SEO优化。

维护:后台维护、流量转发。

安全:伪静态页面。

ReWrite相关指令

指令 默认值 使用范围 作用
rewrite 无配置 server, location, if 实现URL重写和重定向

rewrite常用全局变量

变量名 说明
$args 请求URL中的参数,例如http://example.com/?arg1=value1&arg2=value2中的"arg1=value1&arg2=value2"
$http_user_agent 用户访问服务的代理信息
$host 访问服务器的server_name值
$document_uri 当前访问地址的URI
$document_root 当前请求对应location的root值
$content_length 请求头中的Content-Length的值
$content_type 请求头中的Content-Type的值
$http_cookie 客户端的cookie信息
$limit_rate Nginx服务器对网络连接速率的限制
$remote_addr 客户端的IP地址
$remote_port 客户端与服务端建立连接的端口号
$scheme 访问协议(如HTTP或HTTPS)
$server_addr 服务端的地址
$server_name 客户端请求到达的服务器的名称
$server_port 客户端请求到达服务器的端口号
$server_protocol 客户端请求协议的版本(如HTTP/1.1)
$request_body_file 发给后端服务器的本地文件资源的名称
$request_method 客户端的请求方式(如GET, POST)
$request_filename 当前请求的资源文件的路径名
$request_uri 当前请求的URI,携带请求参数

rewrite配置语法

如何在nginx中应用常见的rewrite规则?

 rewrite regex replacement [flag];

regex: 正则表达式,表示想匹配的目标URL。

replacement: 匹配到规则后要定向的路径,如果规则里有正则,则可以使用$index来表示正则里的捕获分组。

flag: 重写类型,可以是last、break、redirect、permanent等。

简单实例

示例1:将所有请求重定向到/pages/maintain.html页面

 rewrite ^(.*)$ /pages/maintain.html break;

解释:会把所有的请求都重定向到/pages/maintain.html页面。

示例2:将/last.html重写到/index.html

 rewrite /last.html /index.html last;

解释:访问/last.html时,页面内容重写到/index.html中。

示例3:将/break.html重写到/index.html并停止后续匹配

 rewrite /break.html /index.html break;

解释:访问/break.html时,页面内容重写到/index.html中,并停止后续的匹配。

示例4:将/redirect.html临时重定向到/index.html

 rewrite /redirect.html /index.html redirect;

解释:访问/redirect.html时,页面直接302临时重定向到/index.html中。

示例5:将/permanent.html永久重定向到/index.html

 rewrite /permanent.html /index.html permanent;

解释:访问/permanent.html时,页面直接301永久重定向到/index.html中。

如何在nginx中应用常见的rewrite规则?

示例6:将/html/*.html重定向到/post/*.html并永久重定向

 rewrite ^/html/(.+?).html$ /post/$1.html permanent;

解释:将/html/*.html格式的URL永久重定向到/post/*.html格式的URL。

示例7:将/search/key重写到/search.html?keyword=key并永久重定向

 rewrite ^/search\/([^\/]+?)(\/|$) /search.html?keyword=$1 permanent;

解释:将/search/key格式的URL永久重定向到/search.html?keyword=key。

相关问题与解答

问题1:rewrite和location的主要区别是什么?

答案:rewrite主要用于在同一域名内更改获取资源的路径,而location则是对一类路径进行控制访问或反向代理,rewrite可以放在server{}、location{}、if{}中,且只能对域名后边的除传递参数外的字符串起作用;location主要用于匹配请求路径并进行相应的处理,包括反向代理到其他服务器。

问题2:在rewrite指令中,last和break的区别是什么?

答案:last相当于Apache的L标记,表示完成rewrite后继续执行新的URL匹配流程;break则会停止当前虚拟主机的后续rewrite指令集,不再继续匹配新的location,具体例子如下:

当访问http://walidream.com/break时,根据规则rewrite ^/break /test/ break;,URL被重写为http://walidream.com/test/,但不会进一步匹配新的location,最终返回404错误码。

当访问http://walidream.com/last时,根据规则rewrite ^/last /test/ last;,URL被重写为http://walidream.com/test/,然后重新发起一次请求,匹配到新的location并返回200状态码及JSON内容{"status":"success"}

到此,以上就是小编对于“nginx的常见rewrite规则讲解和示例”的问题就介绍到这了,希望介绍的几点解答对大家有用,有任何问题和不懂的,欢迎各位朋友在评论区讨论,给我留言。

    广告一刻

    为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!