2016-04-28 5 views
1

Я разрабатываю динамический сайт angular (используя html5mode, чтобы удалить #). Он использует Elasticsearch, чтобы захватить некоторые данные и отобразить их содержимое. nginx отвечает за сопоставление с Elasticsearch и моим корнем сайта.nginx, prerender и проблема с угловой маршрутизацией

Чтобы получить весь сайт с поддержкой SEO, я пытаюсь интегрировать prerender, используя локальный экземпляр (http://localhost:3000).

Я отчаянно пытаюсь применить магию пренердера в сочетании с nginx location /angular_test. Конфигурация промежуточного программного обеспечения nginx prerender по умолчанию не работает для location s. Найти ниже моей Nginx configration:

upstream elasticsearch { 
    zone elasticsearch 64K; 
    server localhost:9200; 
} 

server { 
    listen 80 default_server; 
    listen [::]:80 default_server; 

    root /var/www/html; 

    index index.html index.htm index.nginx-debian.html; 

    server_name angular_test_server; 

    location /angular_test { 
     rewrite_log on; 
     error_log /var/log/nginx/localhost.error_log notice; 

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

     if ($prerender = 1) { 
     rewrite .* /$scheme://$host$request_uri?; 
     proxy_pass http://localhost:3000; 
     break; 
     } 

     # support html5mode of angular (fallback to index.html and let angular do the routing) 
    try_files $uri $uri/ /angular_test/index.html; 
    } 

    location /es/ { 
     rewrite /es/(.*) /$1 break; 
     proxy_pass http://elasticsearch; 
     proxy_redirect http://elasticsearch /es/; 
    } 

} 

Когда доступ http://localhost/angular_test/search?_escaped_fragment_= я получаю 404, потому что Nginx пытается загрузить файл /var/html/www/angular_test/search. Это должно быть охвачено маршрутизацией углов (см. Try_files, выполняющая попытку на index.html). http://localhost/angular_test?_escaped_fragment_= работает просто отлично

Когда я использую что-то вроде следующего (как показано здесь https://gist.github.com/thoop/8165802), он даже не попадает в часть местоположения @prerender.

location /angular_test { 
    # support html5mode of angular (fallback to index.html and let angular do the routing) 
    try_files $uri $uri/ /angular_test/index.html @prerender; 
} 

Есть ли способ, чтобы получить эту установку работает с prerender? У меня такое ощущение, что я не использую nginx правильно здесь ...

ответ

2

Я выяснил решения. If is really evil в местах nginx!

Он работает, когда логика if(...) перемещается из location и до server. Вот моя окончательная конфигурация:

upstream elasticsearch { 
    zone elasticsearch 64K; 
    server localhost:9200; 
} 

server { 
    listen 80 default_server; 
    listen [::]:80 default_server; 

    root /var/www/html; 

    index index.html index.htm index.nginx-debian.html; 

    server_name angular_test_server; 

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

    location /angular_test { 
     rewrite_log on; 
     error_log /var/log/nginx/localhost.error_log notice; 

     #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 "$host:3000"; 
      rewrite .* /$scheme://$host$request_uri? break; 
      proxy_pass http://localhost:3000; 
     } 

     # support html5mode of angular (fallback to index.html and let angular do the routing) 
     try_files $uri $uri/ /angular_test/index.html; 
    } 

    location /es/ { 
     rewrite /es/(.*) /$1 break; 
     proxy_pass http://elasticsearch; 
     proxy_redirect http://elasticsearch /es/; 
    } 

} 
+0

спас мою жизнь: D –

Смежные вопросы