Answer a question

I'm working to make an AngularJS e-commerce application of mine more SEO friendly so I'm working on getting Prerender.io up and running on the app.

My setup for hosting/serving files is with nginx from a docker container, hosted on AWS.

So far I've:

  1. Altered my 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;
        }
    }
    

UPDATE:

At suggestion of Prerender.io team member, I've hardcoded the redirect to be in https instead of http which was most likely the cause of that 301 issue.

Rewrote this line to fix: rewrite .* /https://$host$request_uri? break;

  1. Added a fragment header tag

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

  2. Set special $locationProvider variables

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

When I share a page on facebook, to test the crawler, it registers on the prerender dashboard at least. (A good sign because at least its hitting prerender.io, so $prerender is being set to 1 in nginx and the right prerender token is getting set).

However I am getting 404.

Does anyone know what I'm doing wrong and/or where I should focus my debugging efforts??

Thanks in advance!!

Answers

Alright so on my setup I had to take out this check for $http_user_agent Prerender, that was causing it to break for some reason.

So I took out the following lines:

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

Then... BOOM! Problem solved.

NOTE:

The original issue I was having was that I was receiving 301 Miss on every attempt to cache. This was because my SSL certificate (and/or DNS) was rejecting reroute attempts to an http page. Only https was allowed. So to fix that I just hardcoded https into the rewrite rule (replacing $scheme).

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

Hope that helps someone else down the line, thanks!

Logo

开发云社区提供前沿行业资讯和优质的学习知识,同时提供优质稳定、价格优惠的云主机、数据库、网络、云储存等云服务产品

更多推荐