Ionic framework 离子型PWA中的SEO
我刚刚用Ionic完成了一个PWA的构建。现在我被困在使PWA搜索引擎优化启用 因为在爱奥尼亚,有#(散列定位策略)在爱奥尼亚启用,这导致在所有的URL中#,这对搜索引擎优化毫无帮助 因此,为了删除#,我尝试在AppModule中设置路径位置策略{locationStrategy:'Path'}。这将从url中删除#。但当我尝试刷新它或直接转到url时,它会返回“cannotget/url” 关于这个问题,我读到的几件事是在每个请求中重写为index.html,或者在node express中尝试如下操作Ionic framework 离子型PWA中的SEO,ionic-framework,seo,ionic3,Ionic Framework,Seo,Ionic3,我刚刚用Ionic完成了一个PWA的构建。现在我被困在使PWA搜索引擎优化启用 因为在爱奥尼亚,有#(散列定位策略)在爱奥尼亚启用,这导致在所有的URL中#,这对搜索引擎优化毫无帮助 因此,为了删除#,我尝试在AppModule中设置路径位置策略{locationStrategy:'Path'}。这将从url中删除#。但当我尝试刷新它或直接转到url时,它会返回“cannotget/url” 关于这个问题,我读到的几件事是在每个请求中重写为index.html,或者在node express中尝
app.get('*', (req, res, next) => {
if ((req.url.indexOf('#') > -1) ||
((req.url.lastIndexOf('.') === -1) ||
(req.url.indexOf('/', req.url.lastIndexOf('.')) > -1))) {
req.url = `/#${req.url}`;
}
next();
});
以上两种方法都不能解决我的问题,因为如果我想直接访问url,即localhost/a/b。上面的解决方案将重写为localhost/home(基本URL),这是我不想要的。我自己解决了
这是我做过的事情的清单
ionViewWillEnter(){
try{
document.querySelector("meta[name='description']").remove();
} catch (e){
}
try{
document.querySelector("meta[name='keywords']").remove();
} catch (e){
}
var description = document.createElement('meta');
description.name = "description";
description.content = "I am a description";
document.getElementsByTagName('head')[0].appendChild(description);
var keywords = document.createElement('meta');
keywords.name = "keywords";
keywords.content = "Code, Learn, Respect";
document.getElementsByTagName('head')[0].appendChild(keywords);
}
IonicModule.forRoot(MyApp, {
locationStrategy: 'path'
})
var express = require('express');
var path = require('path')
var app = express();
app.use(express.static(path.resolve(__dirname, "www")));
app.use('/*', function(req, res){
res.sendFile(__dirname+ '/www' + '/index.html');
});
app.set('port', process.env.PORT || 3000);
app.listen(app.get('port'), function() {
console.log("listening to Port", app.get("port"));
});
{
"source": "/ shop / **",
"function": "ssr"
},
{
"source": "/ * / promotions / **",
"function": "ssr"
}
因为“ssr”是我在云函数中的函数名。因此,我使用库来检查请求是否来自google crowler,以防我将请求重定向到服务器
const prerender = express ();
prerender.use (cors);
prerender.use (
require ('prerender-node')
// .set ('prerenderServiceUrl', 'http: // localhost: 3000')
.set ('prerenderToken', '** TOKEN **')
);
prerender.use (require ('prerender-node'). set ('beforeRender', function (req, done) {
// do you need to do?
console.log ('Rendering URL:', req.path);
done ();
}));
prerender.use (require ('prerender-node') set ('afterRender', function (err, req, prerender_res) {
// do you need to do?
console.log (req.path + 'rendering completed!');
console.log ('Errors:', err);
}));
prerender.get ('*', (req, res) => {
console.log ('Calling function for URL:', req.path);
res.set ('Cache-Control', 'public, max-age = 300, s-maxage = 600');
res.status (200) .send (fs.readFileSync ('./ www / index.html'). toString ());
});
exports.ssr = functions.https.onRequest (prerender);