【问题标题】:config ssl nginx server for prerender angular js app为预渲染 Angular js 应用程序配置 ssl nginx 服务器
【发布时间】:2018-02-21 20:35:23
【问题描述】:

你能告诉我如何配置 nginx 来预渲染我的应用程序吗? 本教程不起作用,当我使用爬虫 googlebot 爬取网站时,我看到了来自 angular 的括号。

我迷路了。

提前多谢

我的 nginx 配置:

server {
listen 80;
listen [::]:80 default_server ipv6only=on;
return 301 https://$host$request_uri;

}

server {
listen 443;
server_name www.thedomain.com;

ssl on;
# Use certificate and key provided by Let's Encrypt:
ssl_certificate /etc/letsencrypt/live/www.thedomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/www.thedomain.com/privkey.pem;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';

location / {
    # Proxy_pass configuration
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_set_header X-NginX-Proxy true;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_max_temp_file_size 0;
    proxy_pass http://0.0.0.0:3000;
    proxy_redirect off;
    proxy_read_timeout 240s;
}

}

}

【问题讨论】:

  • 删除隐含的脏话,实际上是整个难以理解的、不必要的句子。

标签: javascript angularjs node.js nginx prerender


【解决方案1】:

这应该可行:

server {
listen 80;
listen [::]:80 default_server ipv6only=on;
return 301 https://$host$request_uri;

}

server {
listen 443;
server_name www.thedomain.com;

ssl on;
# Use certificate and key provided by Let's Encrypt:
ssl_certificate /etc/letsencrypt/live/www.thedomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/www.thedomain.com/privkey.pem;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';

location / {
    #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_pass configuration
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_set_header X-NginX-Proxy true;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_max_temp_file_size 0;
    proxy_pass http://0.0.0.0:3000;
    proxy_redirect off;
    proxy_read_timeout 240s;
}

}

}

替换 YOUR_TOKEN 后,不要忘记从 X-Prerender-Token 的 proxy_set_header 中删除 #。

然后,您需要测试您的 URL 是否附加 ?_escaped_fragment_= 查询参数。如果您的网址如下所示:

https://www.example.com/

你会像这样测试它们:

https://www.example.com/?_escaped_fragment_=

这将强制预呈现页面,以便您可以在那里查看源代码并确保您看到的是静态 HTML 页面,而不仅仅是标签。

【讨论】:

  • 我有义务通过他们的服务吗?我不想支付他们的服务费
  • 不!您可以运行自己的 Prerender 服务器,只需支付服务器费用:github.com/prerender/prerender
猜你喜欢
  • 2018-07-05
  • 1970-01-01
  • 1970-01-01
  • 2020-07-14
  • 2018-10-03
  • 2018-11-23
  • 1970-01-01
  • 2018-08-16
  • 1970-01-01
相关资源
最近更新 更多