我应该在nginx中使用rewrite或return或proxy_pass吗?

前端之家收集整理的这篇文章主要介绍了我应该在nginx中使用rewrite或return或proxy_pass吗?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

Apache documentation非常清楚地表明mod_rewrite应该只是最后的手段.对于Nginx,陷阱部分有一些示例,其中request_uri基本上没有变化.

情况是这样的:

>我们(一个研究所的一个部门)有一个主要的网络服务器,即将升级(运行Debian 6).为了处理升级,我已经设置了一个Nginx服务器,它将已知的部件代理到升级后的服务器,其他部件代理到旧服务器.
>旧服务器有许多ProxyPass规则(其大量工作是代理).我希望将它们全部转移到Nginx,因为据我所知,Nginx在代理方面更具性能.
>大量用户拥有由另一台服务器提供服务的用户主目录.对于这些用户,可以使用波浪号和非波形版本(例如,http://my.site/muru和http://my.site/~muru将代理到http://other.server/~muru,但http://other.server/muru不存在).
>许多文件夹被代理到同一服务器上的不同文件夹. (例如,http://my.site/local-club将代理到http://my.site/~local-club).

我的主要问题是:

>鉴于A和B都在不同的服务器上代理C,我应该使用重写或位置返回将B的请求重定向到A,还是继续代理两者?
>鉴于A和B都在同一台服务器上,B代理到A,我应该使用重写还是返回将B重定向到A?

重定向(和返回)具有清楚地指示两个目录之间的关系的好处.

我的重写规则如下:

rewrite ^/B(/.*) /A$1 permanent;

并且退货规则:

location ~ ^/B(/.*) {
    return 301 /A$1;
}

附:

location ~ ^/~(A|D|E|F..)/ {
    proxy_pass https://other.server;
    proxy_redirect default;
}
最佳答案
如果您的Nginx服务器每秒处理数千个请求并且您希望避免每个请求在重写正则表达式匹配中花费cpu时间,那么execpt并不重要.现在,我会说使用最清晰的方式编写配置文件,直到达到此限制,然后如果您没有预算来扩展基础架构,那么就应该考虑欺骗配置以适应您的流量.返回的缺点是,如果您有多个重定向,最终会有一个包含一个返回指令的位置.使用重写,您可以将其中的多个包装在一个通用位置,并在第一个参数中测试更具体的模式.

更新:通用位置中的多重定向示例:

location /B {
    rewrite ^/B/foo/(.*)$/A/newfoo/$1 permanent;
    rewrite ^/B/bar/(.*)$/A/newbar/$2 permanent;
    rewrite ^/B/(.*)$/A/$1 permanent;
}

猜你在找的Nginx相关文章