我想做的事:
这是一个单页应用程序。在我更改之前,配置看起来像这样(并且有效):
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”,我尝试使用映射(在这种情况下我可以使用映射吗?),但仍然无法解决这个问题。
有什么想法吗?
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
。