我正在尝试解决 SPA(即 javascript 呈现的页面)无法提供 Twitter 元数据且元数据必须是服务器 html 页面的一部分这一事实。有很多适当的解决方案可以解决此问题,例如服务器端呈现,但我正在寻找一种更快捷的方法,因为我希望此方法适用于仅由 3 个不同 URL 提供的页面。
我想要实现的目标是:
http://example.com=> 正常提供 index.html(index.html 已对元标头标签进行硬编码)
http://example.com/accept提供 index.html,但通过使用 sub_filter 替换元标记,其中包含单词 accept
http://example.com/reject提供 index.html,但通过使用 sub_filter 替换元标记,其中包含单词“reject”
我尝试使用不同的位置,例如:
location / {
try_files $uri /index.html;
}
location /accept {
sub_filter 'normal' 'accept';
sub_filter_once off;
try_files $uri /index.html;
}
但是我得到的 index.html 带有正常的元标记。如果我将 sub_filter 移到 / 位置,那么字符串替换就可以正常工作。
还尝试了重写,如果在位置内部等等,但无法使其工作。
答案1
语句的最后一个元素try_files
寻找另一个元素location
来处理 的请求/index.html
,这就是为什么它不在同一个块中处理location
。
您可以使用alias
指示或rewrite...break
保持在同一位置块内进行处理。
location /accept {
default_type text/html;
alias /path/to/index.html;
sub_filter 'normal' 'accept';
sub_filter_once off;
}
或者:
location /accept {
rewrite ^ /index.html break;
sub_filter 'normal' 'accept';
sub_filter_once off;
}
答案2
Richard Smith 是对的,问题出在 (fallback) 的最后一个元素上,try_files
因为 fallback 是在另一个上下文中处理的。所以最简单的答案就是index.html
不再将其作为最后一个元素。
location /accept {
sub_filter 'normal' 'accept';
sub_filter_once off;
try_files $uri /index.html /index.html; # notice this with 2 index.html
}