rewrite 正则表达式 替换目标 [flag]
。rewrite ^/old-page$ /new-page.html permanent;
将永久重定向旧页面到新页面。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配置语法
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中。
示例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规则讲解和示例”的问题就介绍到这了,希望介绍的几点解答对大家有用,有任何问题和不懂的,欢迎各位朋友在评论区讨论,给我留言。