这Apache 文档非常清楚地表明这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,我应该使用
rewrite
或location
将return
请求重定向B
到A
,还是继续代理两者? - 假设 A 和 B 都在同一台服务器上,并且 B 被代理到 A,我应该使用重写还是返回将 B 重定向到 A?
重定向(和return
)的好处是可以清楚地表明两个目录之间的关系。
我的rewrite
规则如下:
rewrite ^/B(/.*) /A$1 permanent;
规则如下return
:
location ~ ^/B(/.*) {
return 301 /A$1;
}
和:
location ~ ^/~(A|D|E|F..)/ {
proxy_pass https://other.server;
proxy_redirect default;
}
答案1
这并不重要,除非你的 nginx 服务器每秒要处理数千个请求,并且你想避免每个请求都花费 CPU 时间进行重写正则表达式匹配。现在,我想说使用最清晰的方式编写配置文件,直到达到此限制,然后如果你没有预算来扩展你的基础设施,那么是时候考虑欺骗你的配置以适应你的流量了。返回的缺点是,如果你有多个重定向,你最终会得到一个位置包装一个返回指令。使用重写,你可以在一个通用位置包装多个,并在第一个参数中测试更具体的模式。
更新:通用位置中多个重定向的示例:
location /B {
rewrite ^/B/foo/(.*)$ /A/newfoo/$1 permanent;
rewrite ^/B/bar/(.*)$ /A/newbar/$2 permanent;
rewrite ^/B/(.*)$ /A/$1 permanent;
}