Предварительный рендеринг без подачи продуктов

Я подаю угловые страницы из экспресса. Я не могу заставить prerender обслуживать отображаемые страницы для продуктов:

http://www.minilolo.com/?_escaped_fragment_=/products/Lolo-Pink

Но другие страницы, подобные этой, в порядке:

http://www.minilolo.com/?_escaped_fragment_=/products

Я думаю, что мне, возможно, придется добавить некоторые экспресс-маршруты, но я хотел бы знать, на правильном ли я пути. Спасибо!

var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');

var app = express();

// uncomment after placing your favicon in /public
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.set('view engine', 'ejs');

app.use(require('prerender-node').set('prerenderToken', 'xyz123'));

/**
 * Development Settings
 */
if (app.get('env') === 'development') {
    // This will change in production since we'll be using the dist folder
    app.use(express.static(path.join(__dirname, '../client')));
    // This covers serving up the index page
    app.use(express.static(path.join(__dirname, '../client/.tmp')));
    app.use(express.static(path.join(__dirname, '../client/app')));


    // Error Handling
    app.use(function(err, req, res, next) {
        res.status(err.status || 500);
        res.render('error', {
            message: err.message,
            error: err
        });
    });
}

/**
 * Production Settings
 */
if (app.get('env') === 'production') {

    // changes it to use the optimized version for production
    app.use(express.static(path.join(__dirname, 'dist')));
    // added to serve up products pages
    app.use(function(req, res) {
        // Use res.sendfile, as it streams instead of reading the file into memory.
        res.sendfile(__dirname + '/dist/index.html');
    });

    // production error handler
    // no stacktraces leaked to user
    app.use(function(err, req, res, next) {
        res.status(err.status || 500);
        res.render('error', {
            message: err.message,
            error: {}
        });
    });
}

module.exports = app;

РЕДАКТИРОВАТЬ: я отследил проблему для предварительного преобразования '?_escaped_fragment_=' в '#!'. Затем Angular не знает, какой маршрут использовать, если у меня нет $locationProvider.hashPrefix('!') (который я не хочу использовать). Я не хочу префикс #, если это может помочь.

2015-09-07T12:17:17.566Z got 200 in 12713ms for http://localhost:3000/#!/products
2015-09-07T12:17:18.773Z Timed out. Sending request with HTML on the page
2015-09-07T12:17:18.785Z got 200 in 12732ms for http://localhost:3000/#!/products
2015-09-07T12:19:04.589Z getting http://localhost:3000/#!/products

person user1074891    schedule 06.09.2015    source источник
comment
Ссылка, которую вы предоставили, у меня работает нормально. В чем проблема?   -  person Alexis King    schedule 06.09.2015
comment
Он показывает контент с http://www.minilolo.com/ вместо фактической страницы продукта http://www.minilolo.com/products/Lolo-Pink   -  person user1074891    schedule 06.09.2015


Ответы (1)


Как поясняется по следующим ссылкам:

https://github.com/prerender/prerender/issues/198 https://developers.google.com/webmasters/ajax-crawling/docs/specification?hl=en

Запрос из поиска имеет '?_escaped_fragment_=' в конце пути, а не сразу после полного доменного имени.

http://www.minilolo.com/?_escaped_fragment_=/products/Lolo-Pink ‹-- не это http://www.minilolo.com/products/Lolo-Pink?_escaped_fragment_= ‹-- это!

person user1074891    schedule 07.09.2015