nginx下的return、rewrite、proxy_pass比较

相信很多朋友都接触过nginx的重定向、重写、转发、代理功能,那么我们究竟应该用什么方式去实现呢,return,rewrite还是proxy_pass?真是一脸懵。。。

下面通过一个场景,来加深理解

场景

1、你通过浏览器和固定的链接经常访问一张“好看的图片”,有一天图片的维护者将它移动了位置(服务器上的目录、移动到其他域名),那意味着你访问不到这张图片了?
2、为了避免这样的情况给用户带来的困扰,可以使用重写、或者重定向,将你的请求转向新的位置(这张图片新的位置),对你来说还是用老的固定的链接访问到了你喜欢的图片。

概念

名称 相同点 不同点 其他称呼
重写 将你的请求转向新的位置

1、重写发生在服务器上,服务器内部将一个URL转到另一个URL,然后返回给客户端

2、客户端并不知道自己的请求被转过一次,浏览器中的URL也始终是一开始访问的那个

3、整个过程客户端发起一次请求

 隐式转发、内部重定向
重定向 将你的请求转向新的位置

1、用户请求服务端后,服务端向客户端发送HTTP 301、302(303、304、307、308),告诉客户端需要去尝试另一个URL

2、意味着客户端知道使用另一个URL并去访问

3、整个过程,客户端发起两次请求

显示转发、外部重定向

比较

名称 模块 说明 语法 语境 示例
return ngx_http_rewrite_module

1、停止处理请求并返回指定的状态码给客户端

2、状态码为301、302、303、307、308时,则为重定向

3、状态码为其他时,可以返回响应主体[text]

1、return code [text];

2、return code URL;

3、return URL;

server、location、if

1、return 200 "hello world";

2、return 301 https://xxx.com;

3、return https://xxx.com;

rewrite ngx_http_rewrite_module

1、如果指定的regex表达式与请求URI匹配,则按照replacement中指定的规则更新URL

2、rewrite指令会根据配置文件中的顺序依次执行,可以使用[flag]参数终止指令向下继续执行

3、如果replacement中替换字符串以“http://”、“https://”、"$scheme"开头,则处理停止,并将重定向返回给客户端

rewrite regex replacement [flag];

可选[flag]参数

  • last—停止当前处理的ngx_http_rewrite_module指令集,重新开始搜索与修改后的URI匹配的location;(重写)
  • break—停止当前处理的ngx_http_rewrite_module指令集;(重写)
  • redirect—返回带有302状态码的临时重定向;如果替换字符串以“http://”、“https://”、"$scheme"开头,则使用;(重定向)
  • permanent—返回带有301状态码的永久重定向。(重定向)

 

server、location、if

1、if (!-e $request_filename){
                rewrite (.*) /index.php last;
      }

2、location /test/ {
               rewrite ^(/test/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 break;
      }

3、rewrite ^(.*)$  https://$host$1 redirect;

4、rewrite ^(.*)$  https://$host$1 permanent;

  proxy_pass ngx_http_proxy_module

1、允许将请求传递到另一台服务器

2、允许将请求传递到另外一个服务

proxy_pass URL

设置代理服务器的协议、地址、端口、可选的URI

  • 协议:http、https
  • 地址:域名、IP、upstream
  • 端口:(可选)
  • URI:(可选)
  • 可以使用变量,如:“proxy_pass http://127.0.0.1$request_uri;”
  • 可以代理到Unix套接字路径,如:“proxy_pass http://unix:/tmp/backend.socket:/uri/;”
  •  
location、 if in location、 limit_except

location /name/ { 
    proxy_pass http://127.0.0.1:8888; 
}

汇总

重定向

1、return状态码为301、302、303、304、307、308时,则为重定向

2、rewrite的replacement中替换字符串以“http://”、“https://”、"$scheme"开头,则为重定向

3、rewrite的flag为redirect,则为302重定向

4、rewrite的flag为permanent,则为301重定向


重写

1、rewrite的flag为last时,且replacement中替换字符串不以“http://”、“https://”、"$scheme"开头,则为重写

2、rewrite的flag为break时,且replacement中替换字符串不以“http://”、“https://”、"$scheme"开头,则为重写

3、使用proxy_pass,则为重写

 

下一篇会写具体的用法!

posted @ 2023-12-20 17:15  第一夫人  阅读(1118)  评论(0编辑  收藏  举报