【问题标题】:Nginx conf for prerendering Angular SPA用于预渲染 Angular SPA 的 Nginx conf
【发布时间】:2018-09-18 14:29:59
【问题描述】:

所以我有我的 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;
        }
    }
}

但是,我的应用在 fb 或任何社交媒体上共享时,只是获得静态标签,或者根本没有标签。

有人能指出错误在哪里,我做错了什么吗?

我还应该在 Angular 中设置任何内容(动态更新标签除外),还是仅用于 nginx 配置?

我也听说过 rendertron,它更容易设置吗?那个 nginx conf 是什么?

更新 1:

所以点击:curl http://127.0.0.1:3010/https://example.com 正在返回预渲染页面(我在端口 3010 上托管预渲染)

点击 curl https://example.com 将返回静态角度。

点击 curl -A "twitterbot" https://example.com 不会返回任何内容。

点击 curl -A "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

【问题讨论】:

    标签: angular nginx prerender


    【解决方案1】:

    在您的情况下,try_files 可能会在运行 @prerender 之前测试 $uri 时返回索引页面。您可以尝试以下配置,我在预渲染配置之后移动了 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;
            }
    }
    

    【讨论】:

    • 还是什么都没有 :( 现在,当我直接转到带有一些 uri 的页面(不是主页)时,它报告 404 nginx..
    • 如果你用这样的配置请求主页,它会返回什么? curl -A "twitterbot" -v https://example.com
    • 还是一样...没有'-v'没有响应和-v 400响应。我都试过了,我的 conf 和你建议的 conf
    • 好的,所以我找到了问题所在。重写不起作用,或者我不知道它应该如何工作。它总是转到“service.prerender.io”而没有任何附加信息,它应该转到“service.prerender.io/example.com”。所以我所做的是设置另一个变量 set $info "/$scheme://$host$request_uri?" 并调用 proxy_pass http://$prerender$info .我知道这是一个 hacky 修复,但你能解释一下为什么重写不起作用吗?
    • 有趣。我们还没有从其他人那里听说过配置的该部分有任何问题。你用的是哪个版本的 nginx?很高兴您能够设置解决方法。如果您继续看到问题,请告诉我们。 support@prerender.io
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-24
    • 1970-01-01
    • 1970-01-01
    • 2018-02-16
    • 2015-05-01
    • 1970-01-01
    相关资源
    最近更新 更多