aspnetcore 实现简单的伪静态化

Intro

在我的活动室预约项目中,有一个公告模块,类似于新闻发布,个人感觉像新闻这种网页基本就是发布的时候编辑一次之后就再也不会改了,最适合静态化了, 静态化之后用户请求的就是静态文件基本不再需要服务器端查询数据库甚至服务器端渲染,可以一定程度上提升服务器的处理能力以及优化用户体验,而且这种静态化的url对 SEO 比较友好。

由于我的这个项目正在开发中,迁移起来不太方便,所以使用的是伪静态化,看上去是访问的 *.html,实际上并不是 html,而是需要服务器处理的。

GetStarted

配置路由信息,注意顺序,伪静态的路由要在默认路由之前

app.UseMvc(routes =>
{
routes.MapRoute("Notice", "/Notice/{path}.html", new
{
controller = "Home",
action = "NoticeDetails"
}); routes.MapRoute(name: "areaRoute",
template: "{area:exists}/{controller=Home}/{action=Index}"); routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}");
});

控制器代码:

/// <summary>
/// 公告详情
/// </summary>
/// <param name="path">访问路径</param>
/// <returns></returns>
public async Task<ActionResult> NoticeDetails(string path)
{
if (string.IsNullOrWhiteSpace(path))
{
return RedirectToAction("Notice");
}
try
{
var noticeBll = HttpContext.RequestServices.GetService<IBLLNotice>();
var notice = await noticeBll.FetchAsync(n => n.NoticeCustomPath == path.Trim());
if (notice != null)
{
notice.NoticeVisitCount += 1;
await noticeBll.UpdateAsync(notice, x => x.NoticeVisitCount); return View(notice);
}
else
{
return RedirectToAction("Notice");
}
}
catch (Exception ex)
{
Logger.Error(ex);
throw;
}
}

实际效果:

https://reservation.weihanli.xyz/Notice/test-notice.html

Q&A

Q:为什么我们要做(伪)静态化?

A:站点下的 *.html 文件有利于网站的 SEO 优化,有利于百度和google爬虫爬你的网站,SEO做的好有利于提高搜索排名【SEO的水也很深、感兴趣的可以自己找资料研究】。

Q:什么是伪静态化?什么是完全静态化?他们的区别是什么?

A:伪静态化是针对完全静态化来说的,(完全)静态化是会实际保存内容到一个 *.html 文件中,而伪静态化则是通过服务器端技术通过匹配 url 符合一定的模式就重新交给指定的程序处理并返回内容。

简单来说,(完全)静态化会有一个实际存在的静态文件,伪静态化则不存在,需要较多服务器端的处理。

Q:伪静态化和完全静态化哪个好?

A:这个问题更好的问法应该是这样的:“什么时候适合用伪静态化?什么时候适合用完全静态化?”,一个事物既然存在就必然有它存在的道理,存在即合理,如果没有存在的意义必将死去。

完全静态化一般会根据一个模板生成一个实际存在的 *.html 文件,完全静态化不需要太多的服务器端处理,客户端请求这个文件时因为是一个静态文件服务器会直接将文件内容返回给客户端,不需要额外的服务器处理。

完全静态化会减少服务器的压力。

伪静态化服务器上并没有静态 *.html文件,只是在服务器断使用了Rewrite,将动态URL进行重写,使动态URL表现为静态URL,以满足网页URL静态需求但网页依然为动态调用的,,是需要很多服务器端处理的,比如url的模式匹配,从数据库中查询数据。

总结:虽然完全静态化URL的网页有打开速度快的优点,但是网站内容巨大的话,势必会使网站的体积变大很多,会有很多的静态化文件,网站迁移的话很麻烦,另一方面如果网站内容很多的时候修改模板的话,再次静态化的时候会是一个比较大的工作量。实际使用的话还是需要根据自己实际需要来选取。

Reference

最新文章

  1. js对象和继承总结
  2. QMenu,contextmenuevent,窗体透明
  3. js-Ajax与Comet
  4. Android Service初始
  5. 使用JDBC处理MySQL大数据
  6. CListCtrl中删除多个不连续的行
  7. haproxy /admin跳转 不会在接口上再次加上admin
  8. selenium Chromediver
  9. [硬件]_ELVE_VS2015下opencv3.3的配置问题
  10. JAVA课程设计---学生基本信息管理系统(201521123039 王兴)
  11. 老司机教你在windows不用软件隐藏重要文件
  12. 如何让一个input输入框居中
  13. java 8中列表对象多条件排序
  14. Storm存储结果至Redis
  15. Spring源码分析(七)bean标签的解析及注册
  16. Linux shell(3)
  17. P2184 【贪婪大陆】
  18. linux下的shell运算(加、减、乘、除
  19. 锁Lock的概念
  20. C#操作并口

热门文章

  1. WPF 4 日历控件(Calendar)
  2. Redis 一些高级用法
  3. ELINK编程器典型场景之远程镜像
  4. C# 中使用OPenCV(Emgu)心得
  5. mysql5.7.18 初始化和运行
  6. 如何在项目中添加Log4net_web.config
  7. JS 浮点加减乘除运算
  8. UAP开发错误之The given System.Uri cannot be converted into a Windows.Foundation.Uri(windows phone背景更换)
  9. OpenSSL的命令行用法,以及参数大全
  10. 使用pjax实现类似github无刷新更改页面url