nginx - 具有多个域的 NGINX 动态重定向
问题描述
用例
我们当前的前端应用程序可以被多个域访问:
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 来实现它,而不必为每个域编写和重复规则?
解决方案
例如:
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
此外,您应该定义一个默认服务器,因为您不希望此服务器块成为您的默认服务器。
推荐阅读
- entity-framework - 如何使用 where 语句在两个表之间创建 Map?
- laravel - Laravel Route 给出 Object not found 错误
- python - 处理高度不平衡数据的正确方法 - 二进制分类
- javascript - 如何拆分javascript函数
- php - 如何在php中创建一个嵌套数组
- sql - 如何在不遍历 SQLite3 的情况下从 SQL 表中获取最后一列的名称?
- python - 如何比较两个不同对象的列表并返回匹配项?
- typescript - 如何获取函数参数的元数据类型?
- python - 有没有办法使用 ML 从合同中提取信息,包括合同文件和目标字符串作为输入和输出?
- javascript - 简单的 JS 错误(应该没有错误日志)