Nginx 重定向路由到子域

Nginx 重定向路由到子域

我正在尝试使用 Nginx 将 15 条不同的路由从文件夹重定向到子域(我已经阅读了一些有关此内容的帖子)。

我很困惑,因为这个重定向正在起作用:

rewrite ^/admin(.*) $scheme://admin.example.com/$1 301;

而这个不是(我的浏览器中的 URL 没有改变):

rewrite ^/app(.*) $scheme://apps.example.com/$1 301;

我错过了什么 ?

当时,我只有这 2 个重定向(稍后我需要 15 个更复杂的重定向)。

编辑:更多有关我的完整 nginx 配置的解释

server {
  listen 80 default_server;
  listen [::]:80 default_server;

  server_name example.com;
  passenger_enabled on;
  rails_env    production;
  root         /home/admin/rails/current/public;

  # redirect server error pages to the static page /50x.html
  error_page   500 502 503 504  /50x.html;
  location = /50x.html {
    root   html;
  }


  # redirects
  # admin
  rewrite ^/admin(.*) $scheme://admin.example.com/$1 302;

  # apps    
  rewrite ^/app(.*) $scheme://apps.example.com/$1 302;

}

编辑2:汤姆问道,我到底想做什么(我更愿意对 URL 保密):

GET http://example.com => http://apps.example.com
GET http://example.com/app => http://apps.example.com
GET http://example.com/app/iphone => http://apps.example.com/iphone
GET http://example.com/app/ipad => http://apps.example.com/ipad
GET http://example.com/support/iphone => http://apps.example.com/support/iphone
GET http://example.com/support/ipad => http://apps.example.com/support/ipad
GET http://example.com/legal/privacy?params=toto => http://apps.example.com/legal/privacy?params=toto
GET http://example.com/legal/terms?params=toto => http://apps.example.com/legal/terms?params=toto
GET http://example.com/legal/about => http://apps.example.com/legal/about

我还有一些 POST 需要重定向,但我认为我需要一个代理,不是吗?

提前致谢。

编辑3:以下是 Tom 回答后我的 GET 重定向:

  # pages to redirect to admin.$host
  location /admin { return 301 $scheme://admin.$host; }

  # pages to redirect to apps.$host
  location /app { return 301 $scheme://apps.$host; }
  location /app/iphone { return 301 $scheme://apps.$host/iphone; }
  location /app/ipad { return 301 $scheme://apps.$host/ipad; }
  location /support/iphone { return 301 $scheme://apps.$host/support/iphone$is_args$args; }
  location /support/ipad { return 301 $scheme://apps.$host/support/ipad$is_args$args; }
  location /legal/privacy { return 301 $scheme://apps.$host/legal/privacy$is_args$args; }
  location /legal/terms { return 301 $scheme://apps.$host/legal/terms$is_args$args; }
  location /legal/about { return 301 $scheme://apps.$host/legal/about; }

效果非常好!

现在,我将打开一个新线程,因为我无法使用我的 proxy_pass 创建 POST 重定向。请参阅那里

答案1

测试时使用 302 重定向,301 会被缓存。清除浏览器缓存并重新启动。当您对配置满意时,将下面的 302 更改为 301。

试试这个——我发布了几个例子,你可以自己解决剩下的问题。你应该阅读nginx 内部的评估顺序,但对于精确匹配来说这并不重要 - 它仅适用于正则表达式匹配。

请注意,这应该按照您的要求进行,但可能不是您想要的 - 请注意,您在示例中没有包含尾随斜杠。

看起来您只想将所有内容重定向到应用程序域,是这样吗?如果是这样,那就容易多了。但这是您所要求的,经过测试。

location /support/ipad {
  # change to 301 when you're 100% happy with all redirects
  return 302 http://example.com/support/ipad;
}

location /app/iphone {
  return 302 http://example.com/app/iphone;
}

location ~* ^/\Z {
  return 302 http://whatever;
}

使用正则表达式可能是一种更有效的方法,但如果您不重定向整个域,则单独执行它们可能是明智的。请注意,~* 表示后面跟着的是正则表达式,这些正则表达式在指定单个精确 URI 的正则表达式之后进行评估。

根据你所说的,根重定向需要有一个正则表达式,以确保它只重定向根域,而不是例如http://www.example.com/pagea.html。如果您希望一切都重定向,那就更容易了。

另外,你是这个意思吗?请注意结尾的斜线

GET http://example.com/ => http://apps.example.com/

^ 表示“URI 的开始”,即不带网站的 URL。这意味着它只会匹配网站的根目录,而不是任何文件夹。/Z 表示“URI 的结束”。您可以在浏览器标头中输出调试信息来帮助解决此问题

location whatever {
  add_header Z_LOCATION "(any text you want)";
  add_header URI $uri;
}

相关内容