我想做的事:
>检查请求是否来自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;
}
使用此配置,只有在条件为真或假的情况下,一切都能正常工作.
如果其中一个条件为真且第二个条件为假(反之亦然),则Nginx始终返回状态404.
我在Nginx网站上找到了“IfIsEvil”,我试图使用映射(我可以在这种情况下使用映射吗?)但我仍然无法解决这个问题.
有任何想法吗?
最好的祝福.
最佳答案
nignx wiki中常见的陷阱有很多.
首先,我已将root指令移至服务器级别.其次,位置是检查网址的最佳方式.所以我重新考虑你的要求
>如果位置由数字组成
>并从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.