Search code examples
angularjsnode.jsnginxprerender

Prerender not detecting the token with Nginx


We have an angular app, and we are trying to implement prerender.io for SEO purposes.

We cached all the url's using the sitemap and followed the official Nginx tutorial: https://gist.github.com/thoop/8165802

But prerender.io keeps displaying this message: We haven't seen a request with your Prerender token yet.

You can check our Nginx code here:

server {
  listen 443;
  server_name example.com;
  access_log /var/log/nginx/example.com.ssl.access.log;
  error_log /var/log/nginx/example.com.ssl.error.log debug;

  #SSL conf

  location / {

    try_files $uri @prerender;

    if ($request_filename ~* ^.*?/([^/]*?)$)
    {
        set $filename $1;
    }

    if ($filename ~* ^.*?\.(eot)|(ttf)|(woff)$){
        add_header Access-Control-Allow-Origin *;
    }

    proxy_redirect off;
    proxy_set_header   X-Real-IP            $remote_addr;
    proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
    proxy_set_header   X-Forwarded-Proto $scheme;
    proxy_set_header   Host                   $http_host;
    proxy_set_header   X-NginX-Proxy    true;
    proxy_set_header   Connection "";
    proxy_http_version 1.1;
    proxy_cache one;
    proxy_cache_key sfs$request_uri$scheme;

    proxy_pass http://example.com;
  }

  location @prerender {
      #proxy_set_header X-Prerender-Token YOUR_TOKEN;

      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;
      }
      if ($prerender = 0) {
          rewrite .* /index.html break;
      }
  }

}

We tried different solutions from stackoverflow to similar problems but nothing works...


Solution

  • I'm wondering if the try_files isn't working here for some reason. Can you try putting the prerender config inline instead?

    server {
      listen 443;
      server_name example.com;
      access_log /var/log/nginx/example.com.ssl.access.log;
      error_log /var/log/nginx/example.com.ssl.error.log debug;
    
      #SSL conf
    
      location / {
    
        if ($request_filename ~* ^.*?/([^/]*?)$)
        {
            set $filename $1;
        }
    
        if ($filename ~* ^.*?\.(eot)|(ttf)|(woff)$){
            add_header Access-Control-Allow-Origin *;
        }
    
        #proxy_set_header X-Prerender-Token YOUR_TOKEN;
    
        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;
        }
    
        proxy_redirect off;
        proxy_set_header   X-Real-IP            $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Proto $scheme;
        proxy_set_header   Host                   $http_host;
        proxy_set_header   X-NginX-Proxy    true;
        proxy_set_header   Connection "";
        proxy_http_version 1.1;
        proxy_cache one;
        proxy_cache_key sfs$request_uri$scheme;
    
        proxy_pass http://example.com;
      }
    
    }