![nginx:重写除一个位置之外的所有内容](https://linux22.com/image/567480/nginx%EF%BC%9A%E9%87%8D%E5%86%99%E9%99%A4%E4%B8%80%E4%B8%AA%E4%BD%8D%E7%BD%AE%E4%B9%8B%E5%A4%96%E7%9A%84%E6%89%80%E6%9C%89%E5%86%85%E5%AE%B9.png)
现在我的 nginx 正在将多个域名重写为我们正在使用的一个主域名。这是我的配置中的一条规则:
server {
listen X.X.X.X:80;
server_name .exampleblog.org;
rewrite ^(.*) http://blog.example.org$1 permanent;
}
对 **exampleblog.org* 的每个请求都会重定向到 blog.example.org
现在我想要www.exampleblog.org/+和exampleblog.org/+将用户重定向到我们的 Google Plus 页面。它尝试了以下不同版本:
server {
listen X.X.X.X:80;
server_name .exampleblog.org;
location /+ {
rewrite ^ https://plus.google.com/12345678901234567890/ permanent;
}
rewrite ^(.*) http://blog.example.org$1 permanent;
}
以上版本和其他版本仅重定向至blog.example.org/+- 我究竟做错了什么?
答案1
nginx 中的指令不一定按照它们在配置文件中出现的顺序应用。服务器级重写在选择位置之前起作用,并且它始终匹配,因此它将重定向所有内容。您需要第二个位置,如下所示:
server {
listen x.x.x.x:80;
server_name .exampleblog.org;
# Match /+ requests exactly
location = /+ {
# I prefer return 301 instead of rewrite ^ <target> permanent,
# but you can use either
return 301 http://plus.google.com/1234567890/;
}
# Match everything else
location / {
return 301 http://blog.example.org$request_uri;
}
}