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]参数
|
server、location、if |
1、if (!-e $request_filename){ 2、location /test/ { 3、rewrite ^(.*)$ https://$host$1 redirect; 4、rewrite ^(.*)$ https://$host$1 permanent; |
proxy_pass | ngx_http_proxy_module |
1、允许将请求传递到另一台服务器 2、允许将请求传递到另外一个服务 |
proxy_pass URL 设置代理服务器的协议、地址、端口、可选的URI
|
location、 if in location、 limit_except |
location /name/ { |
汇总
重定向
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,则为重写
下一篇会写具体的用法!