Nginx - 多个/嵌套的IF语句

时间:2014-03-23 13:56:24

标签: nginx

我想做什么:

  • 检查请求是否来自Facebook
  • 检查网址是否与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;
}

使用此配置,只有在条件为真或假的情况下,一切都能正常工作。 如果其中一个条件为真且第二个条件为假(反之亦然),则nginx始终返回状态404。

我找到了" IfIsEvil"在nginx网站上,我试图使用映射(在这种情况下我可以使用映射吗?)但仍然无法解决此问题。

有什么想法吗?

最好的问候。

1 个答案:

答案 0 :(得分:2)

nignx wiki中常见的陷阱有很多article

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

  • 如果位置包含数字
  • 和来自facebook的请求

我们必须重写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