在提供相同 html 页面的不同 URL 上使用 sub_filter

在提供相同 html 页面的不同 URL 上使用 sub_filter

我正在尝试解决 SPA(即 javascript 呈现的页面)无法提供 Twitter 元数据且元数据必须是服务器 html 页面的一部分这一事实。有很多适当的解决方案可以解决此问题,例如服务器端呈现,但我正在寻找一种更快捷的方法,因为我希望此方法适用于仅由 3 个不同 URL 提供的页面。

我想要实现的目标是:

我尝试使用不同的位置,例如:

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
}

相关内容