开发视频网站,asp.net视频文件转换.fla格式

news/2024/5/9 5:58:49/文章来源:https://blog.csdn.net/JOHNCOOLS/article/details/1939313
最经公司有一个小项目需要把视频转换成FLASH文件,效果就是像用户注册youku网一样,自己可以视频上传,转换成flash格式播放。
苦于以前没有做过,于是马上搜索了相关的文章,看了 http://www.cnblogs.com/xiucai/http://www.cnblogs.com/seebook/关于这方面的文章,对我帮助很大。今天第一天开博,我就记录下它们。

现在出现很多的在线视频网站,其实其文件播放的格式都是.FLA格式(开始还以为是swf了)。

首先,新建一个工程,然后我们部署一下文件夹。在工程的目录下新建几个文件夹如下图:

UpFiles文件夹是要保存你上传的文件(未转换的原始视频文件)
PlayFiles文件夹是用于你转换后保存下的文件(这个转完了就是.fla的格式了,用于网上播放)
ImgFile文件夹是保存截取视频文件的图片
至于mencoder和ffmpeg文件夹。则是视频转换必须的工具引擎。没有mencoder+ffmpeg就根本没办法视频转换了.
(ffmpeg最新版本的下载地址: http://ffdshow.faireal.net/mirror/ffmpeg/
Mencoder新版本的下载地址: http://www5.mplayerhq.hu/MPlayer/releases/win32/)
测试过了,我就是从这里下的。

下面开始正题。
首先,在配置文件中给这些文件夹进行路径的配置.如下
    <appSettings>
        
<!--工具文件夹-->
        
<add key="ffmpeg" value="ffmpeg/ffmpeg.exe"/>
    
<add key="mencoder" value="mencoder/mencoder.exe"/>
    
<add key="mplayer" value="mencoder/mplayer.exe"/>
        
<!--上传文件的路径-->
        
<add key="upfile" value="UpFiles"/>
        
<!--上专文件图片路径-->
        
<add key="imgfile" value="ImgFile"/>
        
<!--上传文件图片大小-->
        
<add key="CatchFlvImgSize" value="240x180"/>
    
<add key="widthSize" value="400"/>
    
<add key="heightSize" value="350"/>
        
<!--转换后文件路径-->
        
<add key="playfile" value="PlayFiles"/>
    
</appSettings>
在上传.ASPX页面中

        标题:
<asp:TextBox ID="txtTitle" runat="server" Width="358px"></asp:TextBox>
        
<asp:RequiredFieldValidator ID="RequiredFieldValidator2" runat="server" ControlToValidate="txtTitle"
            ErrorMessage
="标题不为空"></asp:RequiredFieldValidator>
       
<br />
        
<asp:FileUpload ID="FileUpload1" runat="server" Width="339px" />
        
<asp:Button ID="btnUpload" runat="server" OnClick="btnUpload_Click" Text="上传视频" Width="70px" />
        文件类型
<span style="color:Red;">(.asf|.flv|.avi|.mpg|.3gp|.mov|.wmv|.rm|.rmvb)</span>
            
<asp:RegularExpressionValidator ID="imagePathValidator" runat="server" ErrorMessage="文件类型不正确"
            ValidationGroup
="vgValidation" Display="Dynamic" ValidationExpression="^[a-zA-Z]:(//.+)(.asf|.flv|.avi|.mpg|.3gp|.mov|.wmv|.rm|.rmvb)$"
            ControlToValidate
="FileUpload1">
            
</asp:RegularExpressionValidator>
        
<asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ControlToValidate="FileUpload1"
            ErrorMessage
="文件不为空"></asp:RequiredFieldValidator></div>
        
<div style=" height:0px; border-top:solid 1px red; font-size:0px;"></div>
        
<div>上传列表.</div>
程序工作的原理是:视频先上传上去,然后跟着就是开始转换.
所以.在CS 文件中有

这里为了方便我是用sqlDatasource数据控件做数据的操作.
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class _Default : System.Web.UI.Page 
{
    
// 扩展名定义
    string[] strArrFfmpeg = new string[] {"asf","avi","mpg","3gp","mov" };
    
string[] strArrMencoder = new string[] {"wmv","rm","rmvb" };
    
protected void Page_Load(object sender, EventArgs e)
    {

    }
    
//
    protected void btnUpload_Click(object sender, EventArgs e)
    {
        
        
string upFileName = "";
        
if (this.FileUpload1.HasFile)
        {
            
string fileName = PublicMethod.GetFileName(this.FileUpload1.FileName);// GetFileName();
            if ((string)Session["file"== fileName)
            {
                
return;
            }
            upFileName 
= Server.MapPath(PublicMethod.upFile + fileName);
            
this.FileUpload1.SaveAs(upFileName);
            
string saveName = DateTime.Now.ToString("yyyyMMddHHmmssffff") ;
            
string playFile = Server.MapPath(PublicMethod.playFile + saveName);
            
string imgFile = Server.MapPath(PublicMethod.imgFile + saveName);
            
//System.IO.File.Copy(Server.MapPath(PublicMethod.playFile + "00000002.jpg"), Server.MapPath(PublicMethod.imgFile+"aa.jpg"));
            PublicMethod pm = new PublicMethod();
            
string m_strExtension = PublicMethod.GetExtension(this.FileUpload1.PostedFile.FileName).ToLower();
            
if (m_strExtension == "flv")
            {
//直接拷贝到播放文件夹下
                System.IO.File.Copy(upFileName, playFile+".flv");
                pm.CatchImg(upFileName, imgFile);
            }
            
string Extension = CheckExtension(m_strExtension);
            
if (Extension == "ffmpeg")
            {
                pm.ChangeFilePhy(upFileName, playFile, imgFile);
            }
            
else if (Extension == "mencoder")
            {
                 pm.MChangeFilePhy(upFileName, playFile, imgFile);
            }
            InsertData(
this.txtTitle.Text, fileName,saveName);
            Session[
"file"= fileName;
        }
        
    }
 

    
//
    private string CheckExtension(string extension)
    {
        
string m_strReturn = "";
        
foreach (string var in this.strArrFfmpeg)
        {
            
if (var == extension)
            {
                m_strReturn 
= "ffmpeg"break;
            }
        }
        
if (m_strReturn == "")
        {
            
foreach (string var in strArrMencoder)
            {
                
if (var == extension)
                {
                    m_strReturn 
= "mencoder"break;
                }
            }
        }
        
return m_strReturn;
    }
    
#region 插入数据到数据库中
    
private void InsertData(string MediaName,string fileName,string saveName)
    {
        
//string name=fileName.Substring(0, fileName.LastIndexOf('.'));
        string imgName = saveName + ".jpg";//图片文件名;
        string playName = saveName + ".flv";
        
string sqlstr = "insert into Media(FMediaName,FMediaUpPath,FMediaPlayPath,FMediaImgPath) values(@MName,@MUppath,@MPlaypath,@MImgpath)";
        
//string constr = ConfigurationManager.ConnectionStrings["sqlcon"].ToString();
        SqlDataSource1.InsertCommand = sqlstr;
        SqlDataSource1.InsertCommandType 
= SqlDataSourceCommandType.Text;// CommandType.Text;
        SqlDataSource1.InsertParameters.Add("MName",MediaName);
        SqlDataSource1.InsertParameters.Add(
"MUppath",PublicMethod.upFile+fileName);
        SqlDataSource1.InsertParameters.Add(
"MPlaypath",PublicMethod.playFile+playName);
        SqlDataSource1.InsertParameters.Add(
"MImgpath",PublicMethod.imgFile+imgName);
        SqlDataSource1.Insert();
    }
    
#endregion
 

}
PublicMethod类如下:
在这个类里面主要是做文件转换和保存,在转换文件的时候CPU的利用率可以达100%.

它的主要原理是另起一个进程在转换的时候你会发现你的进程里多了一个.
using System;
using System.Configuration;

/// <summary>
/// Summary description for PublicMethod
/// </summary>
public class PublicMethod:System.Web.UI.Page
{
    
public PublicMethod()
    {
         
    }
    
//文件路径
    public static string ffmpegtool = ConfigurationManager.AppSettings["ffmpeg"];
    
public static string mencodertool = ConfigurationManager.AppSettings["mencoder"];
    
public static string mplayertool = ConfigurationManager.AppSettings["mplayer"];
    
public static string upFile = ConfigurationManager.AppSettings["upfile"+ "/";
    
public static string imgFile = ConfigurationManager.AppSettings["imgfile"+ "/";
    
public static string playFile = ConfigurationManager.AppSettings["playfile"+ "/";
    
//文件图片大小
    public static string sizeOfImg = ConfigurationManager.AppSettings["CatchFlvImgSize"];
    
//文件大小
    public static string widthOfFile = ConfigurationManager.AppSettings["widthSize"];
    
public static string heightOfFile = ConfigurationManager.AppSettings["heightSize"];
    
//   // //获取文件的名字
    public static string GetFileName(string fileName)
    {
        
int i = fileName.LastIndexOf("//"+ 1;
        
string Name = fileName.Substring(i);
        
return Name;
    }
    
//获取文件扩展名
    public static string GetExtension(string fileName)
    {
        
int i = fileName.LastIndexOf(".")+1;
        
string Name = fileName.Substring(i);
        
return Name;
    }
    
//
    #region //运行FFMpeg的视频解码,(这里是绝对路径)
    
/// <summary>
    
/// 转换文件并保存在指定文件夹下面(这里是绝对路径)
    
/// </summary>
    
/// <param name="fileName">上传视频文件的路径(原文件)</param>
    
/// <param name="playFile">转换后的文件的路径(网络播放文件)</param>
    
/// <param name="imgFile">从视频文件中抓取的图片路径</param>
    
/// <returns>成功:返回图片虚拟地址;   失败:返回空字符串</returns>
    public  string ChangeFilePhy(string fileName, string playFile, string imgFile)
    {
        
//取得ffmpeg.exe的路径,路径配置在Web.Config中,如:<add   key="ffmpeg"   value="E:/51aspx/ffmpeg.exe"   />   
        string ffmpeg = Server.MapPath(PublicMethod.ffmpegtool);
        
if ((!System.IO.File.Exists(ffmpeg)) || (!System.IO.File.Exists(fileName)))
        {
            
return "";
        }

        
//获得图片和(.flv)文件相对路径/最后存储到数据库的路径,如:/Web/User1/00001.jpg   
       
        
string flv_file = System.IO.Path.ChangeExtension(playFile, ".flv");


        
//截图的尺寸大小,配置在Web.Config中,如:<add   key="CatchFlvImgSize"   value="240x180"   />   
        string FlvImgSize = PublicMethod.sizeOfImg;

        System.Diagnostics.ProcessStartInfo FilestartInfo 
= new System.Diagnostics.ProcessStartInfo(ffmpeg);

        FilestartInfo.WindowStyle 
= System.Diagnostics.ProcessWindowStyle.Hidden;

        FilestartInfo.Arguments 
= " -i " + fileName + " -ab 56 -ar 22050 -b 500 -r 15 -s " + widthOfFile + "x" + heightOfFile + " " + flv_file;
        
//ImgstartInfo.Arguments = "   -i   " + fileName + "   -y   -f   image2   -t   0.05   -s   " + FlvImgSize + "   " + flv_img;

        
try
        {
            
//转换
            System.Diagnostics.Process.Start(FilestartInfo);
            
//截图
            CatchImg(fileName, imgFile);
            
//System.Diagnostics.Process.Start(ImgstartInfo);
        }
        
catch
        {
            
return "";
        }
        
//
        return "";
    }
    
//
    public string CatchImg(string fileName,string imgFile)
    {
        
//
        string ffmpeg = Server.MapPath(PublicMethod.ffmpegtool);
        
//
        string flv_img =imgFile+".jpg";
        
//
        string FlvImgSize = PublicMethod.sizeOfImg;
        
//
        System.Diagnostics.ProcessStartInfo ImgstartInfo = new System.Diagnostics.ProcessStartInfo(ffmpeg);
        ImgstartInfo.WindowStyle 
= System.Diagnostics.ProcessWindowStyle.Hidden;
        
//
        ImgstartInfo.Arguments = "   -i   " + fileName + "  -y  -f  image2   -ss 2 -vframes 1  -s   " + FlvImgSize + "   " + flv_img;
        
try
        {
            System.Diagnostics.Process.Start(ImgstartInfo);
        }
        
catch
        {
            
return "";
        }
        
//
        if (System.IO.File.Exists(flv_img))
        {
            
return flv_img;
        }

        
return "";
    }
    
#endregion
    
//
    #region //运行FFMpeg的视频解码,(这里是(虚拟)相对路径)
    
/// <summary>
    
/// 转换文件并保存在指定文件夹下面(这里是相对路径)
    
/// </summary>
    
/// <param name="fileName">上传视频文件的路径(原文件)</param>
    
/// <param name="playFile">转换后的文件的路径(网络播放文件)</param>
    
/// <param name="imgFile">从视频文件中抓取的图片路径</param>
    
/// <returns>成功:返回图片虚拟地址;   失败:返回空字符串</returns>
    public  string ChangeFileVir(string fileName, string playFile, string imgFile)
    {
        
//取得ffmpeg.exe的路径,路径配置在Web.Config中,如:<add   key="ffmpeg"   value="E:/51aspx/ffmpeg.exe"   />   
        string ffmpeg = Server.MapPath(PublicMethod.ffmpegtool);
        
if ((!System.IO.File.Exists(ffmpeg)) || (!System.IO.File.Exists(fileName)))
        {
            
return "";
        }

        
//获得图片和(.flv)文件相对路径/最后存储到数据库的路径,如:/Web/User1/00001.jpg   
        string flv_img = System.IO.Path.ChangeExtension(Server.MapPath(imgFile), ".jpg");
        
string flv_file = System.IO.Path.ChangeExtension(Server.MapPath(playFile), ".flv");


        
//截图的尺寸大小,配置在Web.Config中,如:<add   key="CatchFlvImgSize"   value="240x180"   />   
        string FlvImgSize = PublicMethod.sizeOfImg;

        System.Diagnostics.ProcessStartInfo FilestartInfo 
= new System.Diagnostics.ProcessStartInfo(ffmpeg);
        System.Diagnostics.ProcessStartInfo ImgstartInfo 
= new System.Diagnostics.ProcessStartInfo(ffmpeg);

        FilestartInfo.WindowStyle 
= System.Diagnostics.ProcessWindowStyle.Hidden;
        ImgstartInfo.WindowStyle 
= System.Diagnostics.ProcessWindowStyle.Hidden;
        
//此处组合成ffmpeg.exe文件需要的参数即可,此处命令在ffmpeg   0.4.9调试通过 
        
//ffmpeg -i F:/01.wmv -ab 56 -ar 22050 -b 500 -r 15 -s 320x240 f:/test.flv
        FilestartInfo.Arguments = " -i " + fileName + " -ab 56 -ar 22050 -b 500 -r 15 -s " + widthOfFile + "x" + heightOfFile + " " + flv_file;
        ImgstartInfo.Arguments 
= "   -i   " + fileName + "   -y   -f   image2   -t   0.001   -s   " + FlvImgSize + "   " + flv_img;

        
try
        {
            System.Diagnostics.Process.Start(FilestartInfo);
            System.Diagnostics.Process.Start(ImgstartInfo);
        }
        
catch
        {
            
return "";
        }

        
/**/
        
///注意:图片截取成功后,数据由内存缓存写到磁盘需要时间较长,大概在3,4秒甚至更长;   
        
///这儿需要延时后再检测,我服务器延时8秒,即如果超过8秒图片仍不存在,认为截图失败;   
        
///此处略去延时代码.如有那位知道如何捕捉ffmpeg.exe截图失败消息,请告知,先谢过!   
        if (System.IO.File.Exists(flv_img))
        {
            
return flv_img;
        }

        
return "";
    }
    
#endregion

    
#region //运行mencoder的视频解码器转换(这里是(绝对路径))
    
public string MChangeFilePhy(string vFileName, string playFile, string imgFile)
    {
        
string tool = Server.MapPath(PublicMethod.mencodertool);
        
//string mplaytool = Server.MapPath(PublicMethod.ffmpegtool);
        
        
if ((!System.IO.File.Exists(tool)) || (!System.IO.File.Exists(vFileName)))
        {
            
return "";
        }

        
string flv_file = System.IO.Path.ChangeExtension(playFile, ".flv");


        
//截图的尺寸大小,配置在Web.Config中,如:<add   key="CatchFlvImgSize"   value="240x180"   />   
        string FlvImgSize = PublicMethod.sizeOfImg;

        System.Diagnostics.ProcessStartInfo FilestartInfo 
= new System.Diagnostics.ProcessStartInfo(tool);
       
        FilestartInfo.WindowStyle 
= System.Diagnostics.ProcessWindowStyle.Hidden;
        FilestartInfo.Arguments 
= " " + vFileName + " -o " + flv_file + " -of lavf -lavfopts
   i_certify_that_my_video_stream_does_not_use_b_frames -oac mp3lame -lameopts abr:br=56 -ovc lavc
-lavcopts vcodec=flv:vbitrate=200:mbd=2:mv0:trell:v4mv:cbp:last_pred=1:dia=-1:cmp=0:vb_strategy=1
-vf scale=
" + widthOfFile + ":" +heightOfFile + " -ofps 12 -srate 22050";
        
try
        {
            System.Diagnostics.Process.Start(FilestartInfo);
            CatchImg(flv_file, imgFile);
        }
        
catch
        {
            
return "";
        } 
        
//
        return "";
    }
    
#endregion
}

全文的主要内容就在这里了

此DEMO的源文件可以 点击这里下载. 
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_838606.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ASP.NET2.0实现网站的自动升级

网站的自动升级主要是要实现从一台服务器上下载某些文件到本服务器上&#xff0c;然后对下载下来的文件进行更新等操作。比如&#xff0c;现在有服务器A,服务器B和客户端C。作为COM公司开发的产品DIV网站系统被安装到服务器B上&#xff0c;而它的更新设置及更新文件则在服务器A…

谈谈wordpress网站固定链接URL如何设置好?

有不少站长不知道wordpress网站固定链接URL如何设置好&#xff0c;今天福利吧就来仔细给你分析一下。很多人已经都知道了wordpress默认的网址形式是带问号的&#xff0c;这种网址对SEO 来说很不好&#xff0c;是动态的网址&#xff0c;影响搜索引擎的排名和收录。 那么wordpres…

【seo】网页开发 代码优化 1

URL要静态&#xff0c;不能是动态或者伪静态。网站图片 img标签添加alt和title属性。 Title“这张图片的内容”&#xff0c;比如这是一张人物图片&#xff0c;那么就是title“人物名” Alt “XXX-建中集团”&#xff0c;这里的XXX指人、物名或栏目名。例子同上alt“人物名-建…

【seo】网页开发 代码优化 2

超链接<a> 目前<a>标签隐藏在CSS里&#xff0c;不能被搜索引擎抓取&#xff0c;应直接放在前端<div>代码中&#xff0c;不要放在样式里&#xff0c;也不要用任何方式隐藏。 参考案例&#xff1a;百度百科 CSS CSS放在统一的样式文件中&#xff0c;需要使用的…

【seo】网页开发 代码优化 3

TDK A.首页 title:中商碳素研究院-铝及铝用碳素企业探索者 Keywords:中商碳素研究院&#xff0c;碳素&#xff0c;铝用碳素&#xff0c;有色金属 Description&#xff1a;中商碳素研究院总部位于上海&#xff0c;是有色金属、铝及铝用碳素行业国内首家互联网科技、工业、贸易…

【seo】网站优化工具 - 5118 入门教程

网站工具&#xff1a; https://www.5118.com/ 1、 打开官网 2、安装浏览器插件 3、开始SEO的工作

盘点:144个免费学习网站,全网最全资源合集

亲测整理144个免费学习网站&#xff0c;强烈推荐其中44个&#xff0c;正文多图预警。 先看目录&#xff1a; 一、国内MOOC类网站&#xff08;多综合类&#xff09; 小科普&#xff1a;MOOC&#xff08;massive open online courses&#xff09;&#xff0c;即大型开放式网络课…

大型网站之分布式会话管理

为什么80%的码农都做不了架构师&#xff1f;>>> 随着网站的功能和用户越来越多&#xff0c;单机器服务部署的Web应用已经不能再支持了。这时候就需要优化或调整目前的架构&#xff0c;具体怎么优化&#xff0c;或先优化哪部分&#xff0c;这取决于网站的具体情况&a…

15个优秀的PHP免费在线学习网站

PHP是一种功能强大的服务器端脚本语言&#xff0c;旨在帮助Web开发人员快速开发动态页面。 本文为您介绍15个优秀的PHP免费在线学习网站&#xff0c;希望对您学习PHP有所帮助。 01. The official PHP website – PHP Manual 02. W3 Schools PHP Tutorial 03. Tizag.co…

图文解说Win7系统机器上发布C#+ASP.NET网站

1. 概述 在一台干净的Win7机器上发布ASP.NET网站需要准备的有&#xff1a; a) .NET Framework 环境 b) 数据库 c) IIS 互联网信息服务 d) 待发布的网站代码 其中.NETFramework环境一般安装了VS2008 或者VS2010都会自带&#xff0c;也可以下载独…

子目录下的文件如何include网站根目录下的文件

2019独角兽企业重金招聘Python工程师标准>>> ###问题 目录./aaa/bbb/ccc下的index.php需include网站根目录下的conn.php。 解答思路 ###问题归结于如何获取网站的根目录。 $dir $_SERVER[DOCUMENT_ROOT]; //获取到网站的根目录 include($dir.conn.php); //成功将根…

Java学习免费网站

Java学习免费网站论 给一些喜欢自学的&#xff0c;且口袋与我一样轻的小伙伴介绍一个学习网站&#xff01;&#xff01;&#xff01; 第一种 &#xff0c;阿里云 第二种 java学习网站地址 https://how2j.cn/k/number-string/number-string-string/324.html?p182240

网站使用阿里大鱼(阿里大于)发送短信DEMO及步骤

阿里大鱼的短息一条4分5&#xff0c;比起市场上7分5的短信&#xff0c;便宜多了&#xff0c;而且大平台&#xff0c;相信之后选择用它的人也会越来越多。 --------以上为2016-04-16写这篇博客时的题记&#xff0c;今天是2017-07-18&#xff0c;时间过去了一年多&#xff0c;“阿…

第八十六节,html5+css3pc端固定布局,网站结构,CSS选择器,完成导航

html5css3pc端固定布局,网站结构,CSS选择器,完成导航 页面采用1280的最低宽度设计&#xff0c;去掉滚动条为1263像素。 项目是PC端的固定布局&#xff0c;会采用像素(px)单位。 网站结构语义 在没有任何思路的情况下&#xff0c;可以参考大量同类型的网站&#xff0c;了解一下大…

你想建设一个能承受500万PV/每天的网站吗?服务器每秒要处理多少个请求才能应对?...

2019独角兽企业重金招聘Python工程师标准>>> 你想建设一个能承受500万PV/每天的网站吗&#xff1f; 500万PV是什么概念&#xff1f;服务器每秒要处理多少个请求才能应对&#xff1f;如果计算呢&#xff1f; PV是什么&#xff1a; PV是page view的简写。PV是指页面的…

[svc][op]网站504无法访问问题处理

504 Gateway Time-out 网站出现了这种情况 架构是:tomcatnginx&#xff0c; 想通过domain.com 跳转到www.domain.com. 客户端访问流程 客户端--dns--cdn---lb—webnode&#xff08;nginx rewritetomcat&#xff09; cdn配置 排查问题&#xff1a; nginx查了下没看出啥问题 ping…

Alexa网站排名爬取

Python 话说是一门面向监狱编程的语言&#xff0c;吾等不信&#xff0c;前来尝试。。。。 开玩笑了~ 前一段时间刚接触 Python 的时候&#xff0c;觉得有些不适应&#xff0c;特别是语法显得别扭&#xff0c;后来发现它和golang还是挺像的 同样的包管理调用机制&#xff1a;…

网站请求出现Referrer Policy: no-referrer-when-downgrade的问题

网站请求出现Referrer Policy: no-referrer-when-downgrade的问题 #netstat –nap |grep 443 //查看端口信息#ps –ef |grep nginx //查看nginx是否启动#systemctl status nginx –l //查看nginx 的错误信息一般是跨域的问题 检查nginx的启动是否正常 此次是 https…

prerender-SPA程序的SEO优化策略

随着web2.0的兴起&#xff0c;ajax的时代已经成为了事实&#xff0c;更如今Knockout,backbone, angular,ember前端MDV(model driver view)框架强势而来&#xff0c;Single Page Application已经为大家所熟悉了。如今常见的SPA程序&#xff0c;restfull和前端MDV之类的框架能够实…