Nginx - 多个/嵌套 IF 语句

问题描述 投票:0回答:1

我想做的事:

  • 检查请求是否来自 Facebook
  • 检查 URL 是否类似于domain.com/2
  • 如果上述条件成立 - 显示来自 /api/content/item/$1?social=1 的内容
  • 如果上述条件不成立 - 显示“正常页面”

这是一个单页应用程序。在我更改之前,配置看起来像这样(并且有效):

location / {
    root /home/eshlox/projects/XXX/project/project/assets/dist;
    try_files $uri $uri/ /index.html =404;
}

我尝试使用 if 语句:

location / {
    set $social 1;
    if ($http_user_agent ~* "facebookexternalhit") {
        set $social UA; 
    }       
    if ($uri ~* "^/(\d+)$") {
        set $social "${social}URL";
    }       
    if ($social = UAURL) {
        rewrite ^/(\d+)$ /api/content/item/$1?social=1;
    }

    root /home/eshlox/projects/XXX/project/project/assets/dist;
    try_files $uri $uri/ /index.html =404;
}

使用此配置,仅当两个条件都为 true 或 false 时,一切才会按我的预期工作。如果其中一个条件为真而第二个条件为假(反之亦然),则 nginx 始终返回状态 404。

我在nginx站点上发现了“IfIsEvil”,我尝试使用映射(在这种情况下我可以使用映射吗?),但仍然无法解决这个问题。

有什么想法吗?

nginx
1个回答
6
投票

nignx wiki 中有关于常见陷阱的好文章

首先,我已将

root
指令移至服务器级别。其次,
location
是检查网址的最佳方式。所以我重新考虑你的要求

  • 如果位置由数字组成
  • 以及脸书的请求

我们必须重写url,结果是:

root /home/eshlox/projects/XXX/project/project/assets/dist;

location / {
    try_files $uri $uri/ /index.html;
}

location ~ "^/\d+$" {
    if ($http_user_agent ~* "facebookexternalhit") {
        rewrite (.+) /api/content/item$1?social=1;
    }

    try_files $uri $uri/ /index.html;
}

此外,几乎没有理由在

=404
指令中的
/index.html
之后添加
try_files

© www.soinside.com 2019 - 2024. All rights reserved.