Я разрабатываю динамический сайт 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 правильно здесь ...
спас мою жизнь: D –