具有多个域的 NGINX 动态重定向

标签 nginx url-rewriting

用例

我们当前的前端应用程序可由多个域访问:

https://boat.com (or https://www.boat.com)
https://car.com
https://plane.com
...

每个域都基于域名呈现具有不同内容和主题的相同应用。

我们现在正试图将所有内容合并到一个独特的域下。因此,不要使用其以前的域访问该站点:

https://car.com

我们想使用以下 url 访问它:

https://common.com/car

在代码上,我们已经负责更改逻辑以根据这个新的路由系统提供正确的内容。

问题

我们希望在用户尝试从旧域访问应用程序时自动将他们重定向到正确的路由。示例:

https://boat.com      => redirect => https://common.com/boat
https://car.com       => redirect => https://common.com/car
...

但我们也希望能够重写更复杂的 url:

https://boat.com/categories/name-1     => redirect => https://common.com/boat/categories/name-1
https://car.com/posts/super-title-2    => redirect => https://common.com/car/posts/super-title-2

有没有一种方法可以动态地/以编程方式使用 NGINX 来实现它,而不必为每个域编写和重复规则?

最佳答案

您可以使用regular expression server_name 获取域名。 .

例如:

server {
    listen 80;
    listen 443 ssl;

    ssl_certificate     /path/to/$ssl_server_name.crt;
    ssl_certificate_key /path/to/$ssl_server_name.key;

    server_name   ~^(www\.)?(?<domain>[^.]+)\.com$;
    return 301 https://example.com/$domain$request_uri;
}

问题在于为每个已弃用的域选择正确的 SSL 证书。 Nginx 动态选择证书的能力有限,这涉及使用 $ssl_server_name 变量。这意味着您将需要一个包含所有可能的证书组合的目录,即使其中一些文件是相同的。

例如:

boat.com.crt
boat.com.key
www.boat.com.crt
www.boat.com.key
car.com.crt
car.com.key
www.car.com.crt
www.car.com.key

此外,您应该定义一个默认服务器,因为您不希望此服务器 block 成为您的默认服务器。

关于具有多个域的 NGINX 动态重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67815009/

相关文章:

NGINX:如何返回内联 html?

php - htaccess 重写子域,没有文件名映射和扩展名

nginx.conf和nginx.pid的用户和权限

php - 使用 Nginx 设置 Laravel

asp.net-mvc - 带 URL 重写的 MVC 图像处理程序

c++ - 如何重写这个c++简单代码?

regex - "%"字符导致 IIS URL 重写正则表达式出现问题

mod-rewrite - 如何重定向到包含 anchor (#) 的 url?

linux - 检查80端口是否被拒绝?

python - 上游超时(uWSGI + NGINX + Flask)