简体   繁体   English

用于预渲染Angular SPA的Nginx conf

[英]Nginx conf for prerendering Angular SPA

So I have next configuration for my Angular SPA app: 因此,我为Angular SPA应用程序配置了下一个配置:

server {
        listen 80;
        server_name idj.rtech.rs;
        return 301 https://example.com$request_uri;
}

server {

        listen 443 ssl; # managed by Certbot
        ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # managed by Certbot
        ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # managed by Certbot
        include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
        ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

        root /var/www/example.com/dist;

        # Add index.php to the list if you are using PHP
        index index.html index.htm index.nginx-debian.html;

        server_name idj.rtech.rs;

        location / {

            # First attempt to serve request as file, then
            # as directory, then fall back to displaying a 404.
            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|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 $prerender;
        }
        if ($prerender = 0) {
            rewrite .* /index.html break;
        }
    }
}

But still, my app, when shared on fb or any social media, is just getting static tags, or not tags at all. 但是,当我的应用程序在fb或任何社交媒体上共享时,我只是获得静态标签,或者根本没有标签。

Can someone point out where the mistake is, and what I am doing wrong? 有人可以指出错误在哪里,以及我在做什么错吗?

Should I also set anything in angular (except dynamic updating tags), or is it just for nginx config? 我是否还应该以角度设置任何内容(动态更新标签除外),还是仅用于nginx配置?

Also I heard about rendertron, is that easier to setup? 我也听说过rendertron,设置起来容易吗? What's the nginx conf for that? 什么是nginx conf?

UPDATE 1: 更新1:

So hitting: curl http://127.0.0.1:3010/https://example.com is returning the prerendered page (I am hosting prerender on port 3010) 所以点击: curl http://127.0.0.1:3010/https://example.com返回了预渲染的页面(我在端口3010上托管了预渲染)

Hitting curl https://example.com is returning static angular. 点击curl https://example.com会返回静态角度。

Hitting curl -A "twitterbot" https://example.com doesn't return anything. 击中curl-“ twitterbot” https://example.com不返回任何内容。

Hitting curl -A "twitterbot" -v https://example.com returns following: 击中curl-“ twitterbot” -v https://example.com返回以下内容:

< HTTP/1.1 400 Bad Request
< Server: nginx/1.10.3 (Ubuntu)
< Date: Wed, 19 Sep 2018 11:16:54 GMT
< Content-Type: text/html;charset=UTF-8
< Transfer-Encoding: chunked
< Connection: keep-alive
< Vary: Accept-Encoding

In your case, the try_files might be serving back the index page when it test the $uri before @prerender is even run. 在您的情况下,当try_files在$ prerender运行之前测试$ uri时,try_files可能会返回索引页。 Can you try the following config where I've moved the try_files after the prerender config? 您可以在预配置之后将try_files移到哪里的以下配置吗?

server {
        listen 80;
        server_name idj.rtech.rs;
        return 301 https://example.com$request_uri;
}

server {

        listen 443 ssl; # managed by Certbot
        ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # managed by Certbot
        ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # managed by Certbot
        include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
        ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

        root /var/www/example.com/dist;

        # Add index.php to the list if you are using PHP
        index index.html index.htm index.nginx-debian.html;

        server_name idj.rtech.rs;

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

            try_files $uri $uri/ =404;
        }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM