ASP伪静态技术(JS版)
一、什么是静态技术?
所谓静态的意思,就是地址中不带问号。
二、为什么要用伪静态技术?
Web应用程序最大的特点之一就是无状态,当一个页面跳转到另一个页面时,那么这个页面上的所有参数
都将抛弃,所以动态页面一般利用url地址来保存其参数,就像:
www.oursn.com/essay.asp?id=1 这样,搜索引擎在录取该页面时,可能会因为问号而进入死循环(以前动网就有这样一个漏洞,蜘蛛进去
出不来了),所以很多时候带问号的地址是不会进去的,这样便降低了页面的收录效率。
既然这样,那么选用不带问号的url不是可以更好的让搜索引擎收录自己的网页?的确。静态网页的url正好
不带问号,所以我们要伪造静态,目的就是为了SEO,提高网站的收录效率。
三、实现静态的三种方法
1、 重写url参数
参数过多,也不利于搜索引擎收录,故可以通过修改参数实现静态。
先看动态的url地址,当我们点击它时,页面跳转到essay.asp页面的同时,还传递给页面一个参数id=1,然
后我们取得了id的值,再由"select * from article where id="& ID 找到对应的记录。由此可知,整个过程的
关键是取得参数的值,所以,也可以在静态的url包含该参数的值。
又要包含参数的值,又要考虑静态,于是得出一个解决方案,即要实现这样的转换:
www.oursn.com/essay.asp?id=1
www.oursn.com/essay.asp?/1.html
比较两个url的格式,我们仅仅改变动态地址的参数,这种方式叫作重写url参数法。
不过它也存在表面和内在的缺陷。例如,它仍然存在.asp的记号,更重要的是它并没有去掉问号。
2、 ISAPI_Rewrite程序
ISAPI_Rewrite是一个强大的基于正则表达式的url处理引擎。它是专为IIS设计的。ISAPI_Rewrite有两个版
本:ISAPI_Rewrite Full与ISAPI_Rewrite Lite。ISAPI_Rewrite Lite是免费版本,但不支持反向代理功能。
ISAPI_Rewrite Full只能下载到30天的试用版本。
用ISAPI_Rewrite实现asp的静态化,将动态网页链接rewriting成静态链接是最保险和稳定的面向搜索引擎
优化方式。但这种方式不支持虚拟站点。而且对于虚拟主机的站长不太实用或太麻烦。
3、 XMLHttp组件
当我们做好一个asp程序后,如果某个页面长期不做修改,那么我们是不是可以考虑将它生成静态页呢。就
好象有一个leave.asp页面,若这个页面长期不做修改,那么我们可以利用某种方法将它生成一个leave.htm
页面,这种方法就是用XMLHttp组件。
四、伪静态原理
1、 重写url参数
其基本原理和动态url一致,都是截取参数值,只不过url的写法不同罢了。
前台的核心代码:
var id=parseInt(sParam.replace("/","").replace(".html","")); 后台的核心代码:
var sParam=String(Request.ServerVariables("QUERY_STRING"));
var id=parseInt(sParam.replace("/","").replace(".html",""));
2、 ISAPI_Rewrite程序
通过正则表达式重写url地址实现静态,正则表达式在httpd.ini中编辑。其格式为:
RewriteRule /test-([0-9,a-z]*).html /test.asp\?id=$1 RewriteRule是关键词,必须有的,没为什么。
/test-([0-9,a-z]*).html /:两跟正斜杠里编辑想要的静态地址的正则表达式。
test.asp\?id=$1:动态url的原型
这种方式仍然是在通过修改参数的位置实现静态,但和上面提到的修改参数位置不同的是:它的url中不包
含.asp等动态url的特征,而且也没有问号。
3、 XMLHttp组件
用XMLHttp组件实现的静态是真正的静态,因为它生成了真正的html文件,当页面跳转时,首先访问的是
html文件,再访问的是asp文件。
用户点击链接时,首先发送异步请求,返回请求页面的所有内容,包括文本和二进制。然后把这些内容输入
到Stream对象里进行保存,从而生成与动态页面同名的html文件,这样就实现了静态。
五、方法学
最重要,也是最激动人心的时候来了。现在,我将一步一步地拨开这三种方式的神秘面纱,并且实现相应的功能代码……
1、 重写url参数
Step1: 建立前台文件index.asp,修改url参数形式。由于读取数据库中的记录不是专题的重点,故直接给出:
<!--#include file="config.asp" -->
<%
var rs=Server.CreateObject("adodb.recordset");
sql="select * from Article";
rs.open(sql,conn,1,1)
while(!rs.EOF)
{
%>
<div><%=rs("title")%></div>
<%
rs.MoveNext();
}
rs.Close();
rs=null;
%>
Step2:为了达到伪静态的目的,就必须在前台页面加上伪静态的代码。接下来就要修改url的参数形式:
在<%=rs("title")%>两边插入<a href="article.asp?/<%=rs("id")%>.html">和</a>,即<a href="article.asp?/<%=rs("id")%>.html"><%=rs("title")%></a>。
1、Article.asp?/<%=rs("id")%>.html:这句代码实现了伪静态,当点击该链接后,地址显示的就是href的值。
2、至此前台脚本就写完了,最关键的一句就是article.asp?/<%=rs("id")%>.html。接下来写后台的处理数据。 index.asp:
<!--#include file="config.asp" -->
<%
var rs=Server.CreateObject("adodb.recordset");
sql="select * from Article";
rs.open(sql,conn,1,1)
while(!rs.EOF)
{
%>
<div><a href="article.asp?/<%=rs("id")%>.html"><%=rs("title")%></a></div>
<%
rs.MoveNext();
}
rs.Close();
rs=null;
%>
Step3:新建一个后台文件Article.asp,保存核心代码。由于连接数据库不是本专题的重点,故直接给出:
<!--#include file="config.asp" --> /*连接数据库的代码*/ <%
ReadNews(id); ‘从数据库中读出记录
%>
<div>
标题: <b><%=News_title%></b><br /> /*显示记录*/
内容: <%=News_content%>
</div>
Step4:由于传递进的url包含参数,故首先截取参数:
var sParam=String(Request.ServerVariables("QUERY_STRING"));
1、ServerVariables是asp的环境变量,UERY_STRING保存了动态url的参数。例如,如果url是www.oursn.com/essay.asp?/1.html,那么sParam保存的值就是问号以后的字符串,即sParam=/1.html。
2、String()是将参数强制性转化为字符串,这里Request .ServerVariables返回的是一个对象object,而不是字符出串,故需要转化。
Article.asp:
<!--#include file="config.asp" --> /*连接数据库的代码*/
<%
var sParam=String(Request.ServerVariables("QUERY_STRING"));
ReadNews(id); ‘从数据库中读出记录
%>
<div>
标题: <b><%=News_title%></b><br /> /*显示记录*/
内容: <%=News_content%>
</div>
Step5:截取参数字符串后,进一步获取id的值,这里是数字1,可以通过字符串方法replace()来实现:
var id=parseInt(sParam.replace("/","").replace(".html",""));
1、sParam.replace("/","")是用空格代替了sParam中的斜杠,即1.html。
2、sParam.replace("/","").replace(".html","")是用空格代替了1.html的. Html,即1,但这时的1还是字符串,再通过parseInt()强制转化为整型,最后赋给id。则id中保存是值型的1。
Article.asp:
<!--#include file="config.asp" --> /*连接数据库的代码*/
<%
var sParam=String(Request.ServerVariables("QUERY_STRING"));
var id=parseInt(sParam.replace("/","").replace(".html",""));
ReadNews(id); ‘从数据库中读出记录
%>
<div>
标题: <b><%=News_title%></b><br /> /*显示记录*/
内容: <%=News_content%>
</div>
config.asp中的代码:
<%@LANGUAGE="JAVASCRIPT" CODEPAGE="936"%>
<%
var db="data.mdb";
var conn = Server.CreateObject("ADODB.Connection")
var connstr="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+Server.MapPath(db);
conn.open(connstr);
var News_title,News_content;
function ReadNews(id)
{
var rs1=Server.createobject("adodb.recordset")
sql1="select id,title,content from article where id="+id;
rs1.open(sql1,conn,3,3);
News_title=String(rs1("title"));
News_content=String(rs1("content"));
rs1.Close();
rs1=null;
}
%>
2、 ISAPI_Rewrite程序
Step1: 下载ISAPI_Rewrite,下载地址:http://www.helicontech.com/download/。
PS:ISAPI_Rewrite分精简(Lite)和完全(Full)版. 精简版不支持对每个虚拟主机站点进行重写,只能进行全局处理。
Step2: 安装.msi的文件。
Step3: 打开Internet 信息服务,右键web站点属性,ISAPI筛选器选项卡.添加筛选器,名称自己填,路径自己指定ISAPI_Rewrite.dll,然后确定。
1、web站点不是虚拟目录,而是与默认网站相同树根的站点,这一点要小心。
2、ISAPI_Rewrite安装好后,不要修改它的默认。
Step4:添加rewrite规则。找到ISAPI_Rewrite目录,把httpd.ini的只读属性去掉,打开编辑.我们要把essay.asp?id=1映射成为essay-1.html这样的类型,需要在httpd.ini里加上这么一行: RewriteRule /essay-([0-9,a-z]*).html /essay.asp\?id=$1
Step5:来测试一下:
1、test.asp,里面写上
<%=request.querystring("inso")%> 2、在httpd.ini里加上这么一行: RewriteRule /test-([0-9,a-z]*).html /test.asp\?inso=$1 3、保存. 4、到浏览器里查看一下效果吧.输入http://127.0.0.1/test.asp?inso=im286和http://127.0.0.1/test-im286.html,显示的内容都是im286。
3、 XMLHttp组件
<%@LANGUAGE="JAVASCRIPT" CODEPAGE="936"%>
<%
function saveData(body,path)
{
var os = Server.CreateObject("adodb.stream");
os.Type=1;
os.Mode=3;
os.Open();
os.Write(body);
os.Position = 0;
os.Type = 2;
os.Charset = "gb2312";
os.SaveToFile(path,2);
os.Close();
os = null;
}
var xmlHttp = Server.CreateObject("Microsoft.XMLHTTP");
xmlHttp.Open("GET","http://localhost/night/index.asp",false);
xmlHttp.Send();
saveData (xmlHttp.responseBody,Server.MapPath("/index.html"));
Response.Write ("保存成功,请打开<a href=/index.html>/temp.html</a>查看");
%>
来源:展洋科技 www.35544216.com
|