【问题标题】:NGINX dynamic redirect with multiple domains具有多个域的 NGINX 动态重定向
【发布时间】:2021-06-03 15:14:09
【问题描述】:

用例

我们当前的前端应用可以被多个域访问:

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

每个域都根据域名呈现具有不同内容和主题的同一个应用程序。

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

https://car.com

我们想使用以下网址访问它:

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 来实现它,而不必为每个域编写和重复规则?

【问题讨论】:

    标签: nginx url-rewriting


    【解决方案1】:

    您可以通过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
    

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

    【讨论】:

    • 感谢您的回答。我会试试看。关于证书,我们已经拥有它们(由 let's encrypt 为每个域生成)
    • 它奏效了,我根据你的例子做了一些调整,但非常感谢你的帮助,因为你,我今天增加了知识:)
    猜你喜欢
    • 1970-01-01
    • 2021-05-01
    • 2018-03-08
    • 2018-10-07
    • 2016-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-14
    相关资源
    最近更新 更多