当前位置:首页 > 技术文章 > 正文内容

Nginx基础知识之rewrite反向代理规则

arlanguage5个月前 (12-11)技术文章40

location ~ .*\.(sh|bash)?$ {

return 403;

}

~是区分大小写的匹配。

? 是匹配前面的字符零次或者一次。

状态码403是Fobidden,表示服务器已经理解请求,但是拒绝执行它。

访问的URL以.sh或.bash结尾,则返回状态码403。

403表示服务器已经理解请求,但是拒绝执行它。

---我是华丽的分隔线---

rewrite指令的语法是:

rewrite regex replacement flag

关键字 正则表达式 替换部分 标记

if ($host ~* www\.(.*) {

set $host_without_www $1;

rewrite ^(.*)$ http://$host_without_www$1 permanent;

}

这里把server_name的主机名,去掉www的后面部分,赋值给了变量$host_without_www。

重写表达式只对相对路径有效,配对主机名,应该使用if语句。

permanent是返回301永久重定向。

这里的$1是/foo,而不是www.mydomain.com/foo。

---我是华丽的分隔线---

rewrite指令的最后一项参数是flag标记,支持的标记有:

last:相当于apache里面的[L],表示完成rewrite。

break:本条规则匹配完成后,终止匹配,不再匹配后面的规则。

redirect:返回302临时重定向。

permanent:返回301永久重定向。

其中last和break用来实现URL重写,浏览器地址栏的URL地址不变;redirect和permanent浏览器的地址栏会显示跳转之后的URL地址。

一般使用alias指令时,必须要用last指令;使用proxy_pass指令时要用break标记。last标记在本条规则执行完毕后,会对其所在的server {…}标签重新发起请求,而break标记则在本条规则匹配完毕后,终止匹配,不再匹配后面的规则。

一般在根location中,即location/{……}或者直接在server标签中编写rewrite规则,使用last标记,在非根location中,则使用break标记。

---我是华丽的分隔线---

/photos/123456重定向到:

/path/to/photos/12/1234/123456.png 可以使用大括号进行分割代码块。

可以用下面的方法:

rewrite "/photos/([0-9]{2})([0-9]{2})([0-9]{2})"

/path/to/photos/$1/$1$2/$1$2$3.png;

[0-9]匹配数字

{n}表示重复几次。

nginx rewrite指令的写法是:

rewrite regex replacement flag

-----我是华丽的分隔线----

*匹配前面的表达式零次或者多次

+匹配前面的表达式一次或者多次

?匹配前面的子表达式零次或者一次

---我是华丽的分隔线----

set variable value

set指令用来定义一个变量,并且给变量赋值。

多目录转换成参数abc.domain.com/sort/2 => abc.domain.com/index.php?act=sort&name=abc&id=2:

if ($host ~* (.*)\.domain\.com) {

set $sub_name $1;

rewrite ^/sort\/(\d+)\/?$ /index.php?act=sort&cid=$sub_name&id=$1 last;

}

这里~*不区分大小写匹配。

sub_name变量设置的值是域名的前缀abc。

\/反斜杠\用来转义斜杠。

\d匹配一个数字字符,等价于[0-9]

+匹配前面的字符一次或者多次

?匹配前面的字符零次或者一次。

\/?匹配URL末尾有/或者没有/。

rewrite表达式中,把(\d+)赋值给了id,其实就是id=2。

---我是华丽的分隔线---

目录对换:

/123456/xxxx->/xxxx?id=123456:

rewrite ^/(\d+)/(.+)/ /$2?id=$1 last;

这里\d匹配1个数字字符,等价于[0-9]。

+匹配前面的字符一次或者多次。

.点匹配任意一个单字符,+匹配前面的字符一次或者多次。

一般在根location中,即location/{……}或者直接在server标签中编写rewrite规则,使用last标记,在非根location中,则使用break标记。

---我是华丽的分隔线---

如果apache的rewrite规则改成nginx的rewrite规则后,使用nginx -t 命令检查发现nginx.conf配置文件有语法错误,那么主要是大括号引起的,那么可以尝试给条件加上引号。

---我是华丽的分隔符----

①:Apache的RewriteCond指令对应Nginx的if指令;

②:Apache的RewriteRule指令对应Nginx的rewrite指令;

③:Apache的[R]标记对应nginx 的redirect标记;

④:Apache的[P]标记对应Nginx的last标记;

⑤:Apache的[R,L]标记对应Nginx的redirect标记;

⑥:Apache的[P,L]标记对应Nginx的last标记。

⑦:Apache的[PT,L]标记对应Nginx的last标记。

鼓励的话语:强者从不抱怨环境!

扫描二维码推送至手机访问。

版权声明:本文由AR编程网发布,如需转载请注明出处。

本文链接:http://www.arlanguage.com/post/73.html

标签: nginx if 语法
分享给朋友:

“Nginx基础知识之rewrite反向代理规则” 的相关文章

什么是Nginx?为什么使用Nginx?《Nginx的作用及优点》

前言 为毛要用nginx服务器代理,不直接用tomcat 7.0,还做多了一次接请求? 这个是我想问的,公司的新项目是要用Nginx+tomcat7+jdk开发的,用户命名可以直接访问tomcat,为啥还要用Nginx?这货是个啥玩意?什么是Nginx? 根据前面的对比,我们可以了解到Nginx是一...

一个比 Nginx 还简单的 Web 服务器

企业级的 Web 服务器非常多,Nginx、Tomcat、Apache、IIS、FastAPI、Flask 等。今天松哥再给大家介绍一个开源的 Web 服务器,这款服务器具备自动 HTTPS 功能和高度可配置性,它的名字是:Caddy。Caddy 是一个 Go 编写的 Web 服务器,类似于 Ngi...

彻底搞懂 Nginx 的五大应用场景 彻底搞懂 nginx 的五大应用场景是什么

— 1 —HPPTNginx本身也是一个静态资源的服务器,当只有静态资源的时候,就可以使用Nginx来做服务器,如果一个网站只是静态页面的话,那么就可以通过这种方式来实现部署。1、首先在文档根目录Docroot(/usr/local/var/www)下创建html目录,然后在html中放一个test...

利用Nginx正向代理实现局域网电脑访问外网

引言在网络环境中,有时候我们需要让局域网内的电脑访问外网,但是由于网络策略或其他原因,直接访问外网是不可行的。这时候,可以借助 Nginx 来搭建一个正向代理服务器,实现局域网内电脑通过 Nginx 转发访问外网的需求。在工作中我遇到了一个类似的情况:在公司网络中,由于管理要求,局域网内的电脑不能直...

php高并发的瓶颈到底在哪

php高并发的瓶颈到底在哪?是同步阻塞?还是nginx+fpm不断创建-销毁进程资源过度消耗?高并发到底是什么问题,是语言问题嘛,为什么说php不适合高并发?求大佬指点从2009年后一直用lnmp,从5.2.17一直到现在的PHP7.4,做的项目无数个,大到日IP10W+、PV50W+的平台,小到日...

nginx 解决 readv() failed (104: Connection reset by peer)

查看nginx error错误,发现上传接口报以下错:2019/10/10 19:58:25 [error] 299784#0: *5967188 readv() failed (104: Connection reset by peer) while reading upstream, clien...