2015-03-01 14 views
12

Ich versuche prerender.io zu verwenden, um einen Schnappschuss von angularjs Seiten zu erhalten. Derzeit habe ich eine NodeJS-Instanz für die Web-App und nginx Reverse-Proxy leitet Anfragen von Port 80 zu 4000 um.Verwenden von Prerender mit Proxy in Nginx

Nach Prerender nginx Handbuch (https://gist.github.com/thoop/8165802) Ich kann Suchmaschinen-Bot-Anfragen an die Prerender URL weiterleiten, sondern weil ich bereits einen Proxy für NodeJS Anwendung habe, ich weiß nicht, wie kann ich try_files Richtlinie Prerender.

Meine Frage ist, wie kann ich sowohl NodeJS-Anwendung Proxy und Prerender-Anweisung verwenden?

+0

Haben Sie das gleiche Problem, aber mit Paster anstelle von Knoten - hinzufügen Bounty – drewmoore

+0

Können Sie eine Nginx.conf liefern dokumentieren, wo Dinge passieren sollten und sie nicht passieren? 2. Auf gisthub sehe ich Beispiele mit vielen "if's", ein if kann nur verwendet werden, um einen Zustand zurückzugeben (wenn xxx yyy zurückgibt), wenn Sie ein if verwenden, um mehrere Variablen zu setzen, wird es schief gehen. Jedes 'if' sollte mit einer 'map' und dann mit einem einzigen if oder in einem Location Block geschrieben werden. – itpp13

Antwort

4

Ich glaube, dass die prerender example die Antwort hat. Wenn prerender auf 1 gesetzt ist, verwendet es rewrite und dann proxy_pass.

So würden Sie dies ändern:

if ($prerender = 0) { 
      rewrite .* /index.html break; 
     } 

dazu:

if ($prerender = 0) { 
     rewrite .* /index.html break; 
     proxy_pass http://[INTERNAL IP]:[PORT]; 
    } 

ich weitere Änderungen vornehmen würden, da Sie Knoten verwenden und einige der Sachen nicht für statische einrichten müssen Dateien.

Hier ist meine letzte Antwort:

server { 
    listen 80; 
    server_name example.com; 

    location/{ 
     try_files $uri @prerender; 
    } 

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)") { 
     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) { 
     proxy_pass http://[INTERNAL IP]:[PORT]; 
    } 
} 
} 

Ich hoffe, das hilft. Eine Sache, die ich hinzufügen werde, ist, dass ich keine Prerender-Engine verwenden würde. Spider können und verlinken auch Links und Seiten, die Javascript und PDFs verwenden.

Nur meine zwei Cent.

+1

'Spider können und führen Index-Links und Seiten, die Javascript und PDFs verwenden sogar. Google hat das JS-Rendering erst im letzten Jahr hinzugefügt. Machen alle Crawler das jetzt? –