用于 SEO 的 nginx 条件预渲染页面(if + try_files)
nginx conditional pre-render pages for SEO(if + try_files)
出于 SEO 目的,我有一个渲染服务器,可以将完全渲染的网页提供给 googlebot。
IF
UA is googlebot THEN proxy pass to rendering server
ELSE
serve page normally
现在的问题是,当我将 if
和 try_files
混合在一起时,它根本不起作用。
如何将以下配置更改为与上述逻辑相同的配置?
location ~ ^/web/(.*) {
if ($http_user_agent ~* "googlebot|bingbot|yandex") {
proxy_pass http://render.domain.com;
break;
}
try_files $uri /project/ /project/dist/;
}
您在该配置中有两个正则表达式。当nginx
遇到新的正则表达式时,它会重置编号的捕获。
因此,虽然您期望 </code> 是来自 <code>location
语句的捕获,但它实际上是来自 if
语句的空捕获。
您可以改用命名捕获。例如:
location ~ ^/web/(?<name>.*) {
if (...) { ... }
try_files $uri /project/$name /project/dist/$name;
}
出于 SEO 目的,我有一个渲染服务器,可以将完全渲染的网页提供给 googlebot。
IF
UA is googlebot THEN proxy pass to rendering server
ELSE
serve page normally
现在的问题是,当我将 if
和 try_files
混合在一起时,它根本不起作用。
如何将以下配置更改为与上述逻辑相同的配置?
location ~ ^/web/(.*) {
if ($http_user_agent ~* "googlebot|bingbot|yandex") {
proxy_pass http://render.domain.com;
break;
}
try_files $uri /project/ /project/dist/;
}
您在该配置中有两个正则表达式。当nginx
遇到新的正则表达式时,它会重置编号的捕获。
因此,虽然您期望 </code> 是来自 <code>location
语句的捕获,但它实际上是来自 if
语句的空捕获。
您可以改用命名捕获。例如:
location ~ ^/web/(?<name>.*) {
if (...) { ... }
try_files $uri /project/$name /project/dist/$name;
}