Zac*_*ook 0 nginx prerender angularjs single-page-application
我正在努力使我的 AngularJS 电子商务应用程序对 SEO 更友好,所以我正在努力让 Prerender.io 在应用程序上运行。
我的托管/服务文件设置是使用来自 AWS 上托管的 docker 容器的nginx。
到目前为止,我已经:
更改了我的 nginx.conf -基于 Prerender 文档推荐的官方 nginx.conf
server {
listen 9001;
server_name localhost;
root /app;
index index.html;
location /store {
proxy_set_header X-Prerender-Token RIDE(H9j9jdeRANDOMtoken;
set $prerender 0;
if ($http_user_agent ~* "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 "service.prerender.io";
rewrite .* /$scheme://$host$request_uri? break;
proxy_pass http://$prerender;
}
expires -1;
add_header Pragma "no-cache";
add_header Cache-Control "no-store, no-cache, must-revalidate, post-check=0, pre-check=0";
try_files $uri$args $uri /index.html =404;
}
}
Run Code Online (Sandbox Code Playgroud)更新:
在 Prerender.io 团队成员的建议下,我已经硬编码重定向,https而不是http最有可能是 301 问题的原因。
重写此行以修复: rewrite .* /https://$host$request_uri? break;
添加了fragment标题标签
<meta name="fragment" content="!">
设置特殊$locationProvider变量
$locationProvider.html5Mode(true);
$locationProvider.hashPrefix('!');
Run Code Online (Sandbox Code Playgroud)当我在 facebook 上分享一个页面时,为了测试爬虫,它至少会在预渲染仪表板上注册。(一个好兆头,因为至少它命中了 prerender.io,所以$prerender在 nginx 中被设置为 1 并且正确的预渲染令牌正在设置)。
但是我得到了 404。
有谁知道我做错了什么和/或我应该把调试工作集中在哪里?
提前致谢!!
好吧,所以在我的设置中,我不得不取消此检查$http_user_agent Prerender,因为某种原因导致它损坏。
所以我拿出了以下几行:
if ($http_user_agent ~ "Prerender") {
set $prerender 0;
}
Run Code Online (Sandbox Code Playgroud)
然后……轰!问题解决了。
笔记:
我遇到的最初问题是301 Miss每次尝试缓存时我都会收到。这是因为我的 SSL 证书(和/或 DNS)拒绝重新路由到http页面的尝试。只https被允许。所以为了解决这个问题,我只是硬编码https到重写规则(替换$scheme)中。
rewrite .* /https://$host$request_uri? break;
Run Code Online (Sandbox Code Playgroud)
希望能帮助到其他人,谢谢!
| 归档时间: |
|
| 查看次数: |
1042 次 |
| 最近记录: |