Nginx – 多重/嵌套的IF语句

我想做的事:

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

这是一个单页的应用程序。 在我的更改configuration看起来像这样(和它的工作):

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; } 

有了这个configuration,一切正常,只要这两个条件是真的或假的。 如果其中一个条件为真,第二个为假(反之亦然),那么nginx总是返回状态404。

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

有任何想法吗?

最好的祝福。

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

首先,我已经将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; } 

而且,在try_files指令中的/index.html之后几乎没有理由使用=404