Nginx配置rewrite重定向跳转

Nginx配置rewrite重定向跳转,第1张

1.功能:使用nginx提供的全局变量或自己设置的变量,结合正则表达式和标志位实现url重写以及重定向

2.位置:rewrite只能放在server{},location{},if{}中。

3.作用域:只能对域名后边的除去传递的参数外的字符串起作用,例如 http://baidu.com/a/we/index.php?id=1&u=str ,只对/a/we/index.php重写

4.如果相对域名或参数字符串起作用,可以使用全局变量匹配,也可以使用proxy_pass反向代理。

5.执行顺序是:

<1> 执行server块的rewrite指令

<2.>执行location匹配

<3. >执行选定的location中的rewrite指令

如果其中某步URI被重写,则重新循环执行1-3,直到找到真实存在的文件;循环超过10次,则返回500 Internal Server Error错误。

6.语法rewrite regex replacement [flag]

7.flag标志位

last : 相当于Apache的[L]标记,表示完成rewrite

break : 停止执行当前虚拟主机的后续rewrite指令集

redirect : 返回302临时重定向,地址栏会显示跳转后的地址

permanent : 返回301永久重定向,地址栏会显示跳转后的地址

因为301和302不能简单的只返回状态码,还必须有重定向的URL,这就是return指令无法返回301,302的原因了。这里 last 和 break 区别有点难以理解

8.last一般写在server和if中,而break一般使用在location中,

last不终止重写后的url匹配,即新的url会再从server走一遍匹配流程,而break终止重写后的匹配,

break和last都能组织继续执行后面的rewrite指令

9 常用正则

. : 匹配除换行符以外的任意字符

? : 重复0次或1次

10 例子:

nginx有时候并不像apache那样智能,对于redirect location的处理尤为惨淡,几乎只能用户手工处理非标准端口的问题。

比如因为种种原因,nginx并不能监听在80端口,或者外部通过NAT方式将请求丢给nginx,外部地址并不是标准http(s)端口,此时nginx并不能美好的处理这些重定向。发生重定向的时候会丢失端口。

比如以下两种参考范例:

浏览器请求的时候会发现只要发生重定向,端口号就会丢失,导致浏览器访问到错误的端口。

分别对这两种情况给出解决方案。

这个很容易搞定,那一堆 proxy_set_header 不知道何时在网上流传开来的,几乎国内外文档无一例外都是这个鸟样子。后来我发现 gitlab-ce 这个用非标准端口访问是没有问题的,我看了一下gitlab-ce的nginx配置,发现是这么配置的:

我又发现nginx软件包释放出的配置文件,发现里面其实是带有一个参考文件 /etc/nginx/proxy_params

这里面写的也是 proxy_set_header Host $http_host,于是乎直接include,搞定

没这个文件就把这些内容手工敲到 location 配置段下。

再细看官方文档,其实也提及了:

这个比较棘手,比如 $document_root 存在 data/index.html 文件,但是访问的时候使用的是 /data 最后没加 / 去表示其访问的是一个目录,服务器此时会进行 301 Moved Permanently 永久重定向处理,但是比较扯的地方在于,如果nginx监听的是非标准端口,这个301返回的 Location 没有端口号,导致浏览器请求出错。

用curl可以很明显的看到这一点:

可以很明显的看到 Location 没有端口号了,这个重定向又和反向代理不一样。于是遍寻google,最终在stackoverflow的问答中找到了解决方案:

通过配置对URL重写的形式带上端口号,问题解决。

Nginx 里的 rewrite 模块是专门负责静态重写的。

该模块允许使用正则表达式改变 URI,并且根据变量来重定向以及选择配置。

基本用法是: rewrite patten replace flag 。 patten 是正则表达式,与 patten 匹配的 URL 会被改写为 replace ,而 flag 是可选的,可以有如下标志:

例如,要将旧域名重定向到新域名上:

如果是跳转到新域名上时要保留路径,那么:

还有一种方式,如果域名不是 www.new.domain.com 就统一转到 https://www.new.domain.com :

$host 是 core 模块内部的一个变量,当请求头里不存在 host 属性或者是个空值, $host 则等于 server_name 。如果请求头里有 host 属性,那么 $host 等于 host 属性除了端口号的部分,例如 host 属性是 www.example.com ,那么 $host 就是 www.example.com 。

也可以单独增加一个 server,在里面统一设置, permanent 是 301 重定向:

rewrite 与 location 配合实现图片文件跳转到 CDN:

访问后台出现重定向次数过多该怎么办?-建站需知


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/2165.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-01-31
下一篇2023-01-31

发表评论

登录后才能评论

评论列表(0条)

    保存