Prerender.io 问题 - 所有内容均未命中“301”,然后是 404 - Nginx + AngularJS

Prerender.io issue - getting '301' miss on everything, then 404 - Nginx + AngularJS

我正在努力使我的 AngularJS e-commerce 应用程序对 SEO 更加友好,因此我正在努力 Prerender.io 和 运行 在应用程序上.

我对 hosting/serving 文件的设置是使用来自 docker 容器的 nginx,托管在 AWS 上。

到目前为止我已经:

  1. 改变了我的 nginx.conf - based on this official nginx.conf recommended by Prerender docs

    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;
        }
    }
    

更新:

根据 Prerender.io 团队成员的建议,我将重定向硬编码为 https 而不是 http,这很可能是导致 301 问题的原因。

重写此行以修复:rewrite .* /https://$host$request_uri? break;

  1. 添加了一个 fragment header 标签

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

  2. 设置特殊 $locationProvider 变量

    $locationProvider.html5Mode(true);
    $locationProvider.hashPrefix('!');
    

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

但是我得到 404。

有谁知道我做错了什么and/or我应该把调试重点放在什么地方??

提前致谢!!

好的,所以在我的设置中,我不得不为 $http_user_agent Prerender 取出这个检查,这导致它由于某种原因而中断。

所以我取出了下面几行:

    if ($http_user_agent ~ "Prerender") {
        set $prerender 0;
    }

然后……砰!问题已解决。

注意:

我遇到的最初问题是每次尝试缓存时都会收到 301 Miss。这是因为我的 SSL 证书 (and/or DNS) 拒绝重新路由到 http 页面的尝试。只允许 https。所以为了解决这个问题,我只是将 https 硬编码到重写规则中(替换 $scheme)。

rewrite .* /https://$host$request_uri? break;

希望对其他人有所帮助,谢谢!