Angularjs Prerender.io在生产环境中不工作

Angularjs Prerender.io在生产环境中不工作,angularjs,node.js,openshift,prerender,Angularjs,Node.js,Openshift,Prerender,我正在尝试使用prerender.io中间件为我的MEAN stack应用程序设置适当的SEO。在当地,一切都很顺利。在生产中,nada。该应用程序托管在OpenShift上。我正在为preRenderToken和preRenderServiceUrl使用环境变量(服务URL仅用于开发人员,并指向另一个本地节点服务器) 在/server/config/local.env.js中: (function() { 'use strict'; module.exports = Env(

我正在尝试使用prerender.io中间件为我的MEAN stack应用程序设置适当的SEO。在当地,一切都很顺利。在生产中,nada。该应用程序托管在OpenShift上。我正在为preRenderToken和preRenderServiceUrl使用环境变量(服务URL仅用于开发人员,并指向另一个本地节点服务器)

/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;
    }

})();
// 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'
/server/config/environment/index.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;
    }

})();
// 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}}">
最后,在每个
$state
配置中,如下所示:

(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
        });

    }

})();
(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=
但该页面未预呈现(如果要验证,这是实际的站点URL)


我一直在玩弄如何将
应用程序放置在不同的位置。使用(prerender…
语句,每次我最终都会得到一些在本地工作的东西,或者部分工作,或者根本不工作。

所以,似乎你需要在片段
之后加下划线?\u转义\u片段
你需要在结尾加下划线-哇。好眼力。这就是答案,谢谢!当使用该查询字符串访问页面时,就让页面预呈现而言,这无疑是最重要的。尽管如此,当我在谷歌的搜索控制台中以谷歌的身份获取信息时,我仍然只能得到部分信息。我想你不知道为什么会这样?@MyCompassSpins,这里有window.prerenderrady标志,你可以在角度加载之前设置为false,在加载所有内容之后设置为true-谷歌渲染一个完整的而不是部分,但是在渲染之前不会对我的角度表达式求值。不过,这可能完全是另一个问题。感谢您的帮助:)@MyCompassSpins,如果您使用
window.prerenderReady=true内部
$rootScope.$on('$viewContentLoaded',function(){..})事件,它应该更好,或者多放一些超时来触发它。众所周知,“以谷歌身份获取”不支持转义片段爬行协议,即使谷歌机器人确实支持它。这就是为什么Fetch作为Google显示您未渲染的标记,但Google搜索结果显示来自prerender的正确信息。