Prerender.io不适用于生产

时间:2015-10-19 13:06:01

标签: angularjs node.js openshift prerender

我试图使用prerender.io中间件让我的MEAN堆栈应用程序设置正确的SEO。在当地,一切都很好。在生产中,nada。该应用程序托管在OpenShift上。我为preRenderToken和preRenderServiceUrl使用环境变量(服务URL仅用于dev,并指向另一个本地节点服务器)。

/server/config/local.env.js

(function()
{
    'use strict';

    module.exports = Env();

    function Env()
    {
        var IEnvironmentVariables = {

            // Prerender.io
            PRERENDER_SERVICE_URL: 'http://localhost:3000/',
            PRERENDER_TOKEN: 'my prerender.io token',
        };

        return IEnvironmentVariables;
    }

})();

/server/config/environment/index.js

// Prerender.io
// I've definitely got both of these set locally and the token set on OpenShift
prerenderServiceUrl: process.env.PRERENDER_SERVICE_URL || process.env.OPENSHIFT_PRERENDER_SERVICE_URL || 'http://localhost:3000/',
prerenderToken: process.env.PRERENDER_TOKEN || process.env.OPENSHIFT_PRERENDER_TOKEN || 'prerender-token'

文档头包含以下meta标记:

<meta name="fragment" content="!">
<meta name="description" content="{{description}}">
<meta name="keywords" content="{{keywords}}">

这些绑定表达式在Angular&#39; $rootScope上设置如下:

(function()
{
    'use strict';

    angular.module('myApp')

    .run(['$rootScope', '$state', Run]);

    function Run($rootScope, $state)
    {
        $rootScope.$on('$stateChangeSuccess', function (event, current, previous) 
        {

            // Meta tags
            $rootScope.description = $state.current.description || 'default-description';
            $rootScope.keywords = $state.current.keywords ? 
            $state.current.keywords
            .toString()
            .split(',')
            .join(' ') : 'default-keywords
        });

    }

})();

最后,在每个$state配置中,如下所示:

(function()
{
    'use strict';

    angular.module('myApp')

    .config(['$stateProvider', Config]);

    function Config($stateProvider) 
    {
        $stateProvider

        .state('main', {
            url: '/',
            templateUrl: 'app/main/main.html',
            controller: 'MainController',
            controllerAs: 'vm',
            description: 'my site description',
            keywords: ['array', 'of', 'keywords']
        });
    }

})();

访问http://localhost:9000/?_escaped_fragment=(或具有该查询字符串的任何其他网站页面)会生成预呈现的页面,并在元标记中包含正确的值。在制作中,我可以访问http://www.dancakes.com/?_escaped_fragment=,但页面未预先呈现(如果您要验证,则是实际的网站网址)。

我已经把app.use(prerender . . .)陈述放在不同的位置,每次我最终都会在本地工作,部分或根本不在制作中。

1 个答案:

答案 0 :(得分:1)

因此,在片段?_escaped_fragment_=

之后,您似乎需要下划线