我发现的所有教程都暗示了在EC2中运行的Node服务器。在节点上,Prerender Server正在运行。 Nginx x配置为接受索引机器人调用并运行Prerender并返回预渲染页面。一个例子here。
但是,所有教程都假设SPA在同一个Node实例中运行,而Nginx则返回到本地SPA(index.html)。我正在将我的prerender服务构建为SaaS。我的SPA在Heroku中,我的预呈现服务在EC2中运行。我真的不太了解Nginx的语法和逻辑,我是一个Javascript开发人员,我正在寻找一些帮助,以便从Nginx返回到我的SPA(预呈现的URL)而不是本地index.html。
通用的Nginx配置如下:
server {
listen 80;
server_name *.example.com;
root /home/prerender;
index index.html;
location / {
try_files $uri @prerender;
}
location @prerender {
set $prerender 0;
if ($http_user_agent ~* "googlebot|bingbot|yandex|baiduspider|twitterbot|facebookexternalhit|rogerbot|linkedinbot|embedly|quora link preview|showyoubot|outbrain|pinterest|slackbot|vkShare|W3C_Validator") {
set $prerender 1;
}
if ($args ~ "_escaped_fragment_") {
set $prerender 1;
}
if ($http_user_agent ~ "Prerender") {
set $prerender 0;
}
if ($uri ~* "\.(js|css|xml|less|png|jpg|jpeg|gif|pdf|doc|txt|ico|rss|zip|mp3|rar|exe|wmv|doc|avi|ppt|mpg|mpeg|tif|wav|mov|psd|ai|xls|mp4|m4a|swf|dat|dmg|iso|flv|m4v|torrent|ttf|woff|svg|eot)") {
set $prerender 0;
}
#resolve using Google's DNS server to force DNS resolution and prevent caching of IPs
resolver 8.8.8.8;
if ($prerender = 1) {
#setting prerender as a variable forces DNS resolution since nginx caches IPs and doesnt play well with load balancing
set $prerender "127.0.0.1:3000";
rewrite .* /$scheme://$host$request_uri? break;
proxy_pass http://$prerender;
}
if ($prerender = 0) {
rewrite .* /index.html break; // HERE I WANT TO SEND BACK TO MY PRERENDERED URL INSTEAD OF INDEX.HTML
}
}
}
我的$ request_uri是呈现的url,前面是“/”之类的
我觉得我需要做一个重写或其他东西并摆脱第一个“/”虽然我真的不理解重写,重定向,返回的概念。我重写文档,但我可能会错过Nginx文化,以了解我真正需要做的事情。
因此,如果您有使用Nginx,SaaS和Prerender的经验,我很乐意听取您关于回到我的SPA的正确方法的信息。
非常感谢。
您只想将其更改为Prerender服务器的URL:
set $prerender "127.0.0.1:3000";
其余的看起来不错。配置将检测像Googlebot这样的爬虫,并将请求代理到Prerender服务器,以便爬虫将接收HTML而不是javascript。
普通用户的任何请求都将收到您正常的javascript页面。如果您有任何疑问,请随时发送电子邮件至[email protected]!