Prerender.io 问题 - 对所有内容都错过了“301”,然后是 404 - Nginx + AngularJS

Zac*_*ook 0 nginx prerender angularjs single-page-application

我正在努力使我的 AngularJS 电子商务应用程序对 SEO 更友好,所以我正在努力让 Prerender.io 在应用程序上运行。

我的托管/服务文件设置是使用来自 AWS 上托管的 docker 容器的nginx

到目前为止,我已经:

  1. 更改了我的 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;

  1. 添加了fragment标题标签

    <meta name="fragment" content="!">

  2. 设置特殊$locationProvider变量

    $locationProvider.html5Mode(true);
    $locationProvider.hashPrefix('!');
    
    Run Code Online (Sandbox Code Playgroud)

当我在 facebook 上分享一个页面时,为了测试爬虫,它至少会在预渲染仪表板上注册。(一个好兆头,因为至少它命中了 prerender.io,所以$prerender在 nginx 中被设置为 1 并且正确的预渲染令牌正在设置)。

但是我得到了 404。

有谁知道我做错了什么和/或我应该把调试工作集中在哪里?

提前致谢!!

Zac*_*ook 5

好吧,所以在我的设置中,我不得不取消此检查$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)

希望能帮助到其他人,谢谢!