PageAdmin网站内容管理系统(CMS)交流论坛

注册

 

QQ登录

只需一步,快速开始

发新话题 回复该主题

【分享】实现手机版伪静态和二级域名绑定到子目录,自动判断设备... [复制链接]

1#
原帖是tjgeass在http://bbs.pageadmin.net/showtopic-34048.aspx提供的方法,我是菜鸟,总结下做法,分享给需要的同学,如果有错误的地方大家一起交流下。

要实现的效果是:主站和手机版都是伪静态,手机版绑定到二级目录,当用户访问PC版文章的时候,判断设备自动跳转到手机版对应页面,反之当用户在浏览手机站文章页面时,通过点击“电脑版”跳转到对应PC版文章页面。例如:主站:http://www.xxxxxxxxx.com,主站文章地址:http://www.xxxxxxxxx.com/article/detail_17509.html
手机站:http://m.xxxxxxxxx.com,手机站目录:wap,手机站文章地址 :http://m.xxxxxxxxx.com/article/detail_17509.html
当用户用手机访问http://www.xxxxxxxxx.com/article/detail_17509.html,自动跳转到http://m.xxxxxxxxx.com/article/detail_17509.html,当点击手机版页面底部“电脑版”连接,返回PC版文章页面。

一、重写URL+301跳转实现子站伪静态和子目录绑定二级域名。

1、不用ISAPI筛选的方式实现伪静态,如果用了,把IIS中自己后加的伪静态插件去掉。
这个PA官方的默认的伪静态插件可以实现主站伪静态,子站伪静态不能实现。感觉其实用这个插件,然后按照一样的思路,改INI文件和ASPX文件,应该一样可以做子站伪静态,不去实验了,有兴趣的同学试验下,分享出来吧o(∩_∩)o ,我就用web.config的方式算了。

2、把二级子域名m.xxxxxxxxx.com做A解析或别名解析到主站,改web.config配置,加入重写和跳转规则。
在这之前可以下载微软的URL重写组件rewrite,可视化操作,帮助理解代码和调试。x86服务器组件地址:https://download.microsoft.com/download/4/9/C/49CD28DB-4AA6-4A51-9437-AA001221F606/rewrite_x86_zh-CN.msi

m.xxxxxxxxx.com是二级域名,wap是二级目录。将以下URL重写规则加入<system.webServer></system.webServer>中。

        <rewrite>
            <rules>
                <rule name="列表页静态" enabled="true">
                    <match url="^([^.]+)/list_([0-9]+).html$" ignoreCase="false" />
                    <action type="Rewrite" url="{R:1}/index.aspx?page={R:2}" appendQueryString="false" />
                </rule>
                <rule name="www伪静态" enabled="true">
                    <match url="([A-Za-z\d_]+)/detail_([0-9]+).html$" ignoreCase="true" />
                    <action type="Rewrite" url="/e/aspx/detail.aspx?table={R:1}&amp;id={R:2}" appendQueryString="false" />
                    <conditions>
                        <add input="{HTTP_HOST}" pattern="^www.xxxxxxxxx.com" />
                    </conditions>
                </rule>
                <rule name="m伪静态" enabled="true">
                    <match url="([A-Za-z\d_]+)/detail_([0-9]+).html$" ignoreCase="true" />
                    <action type="Rewrite" url="/e/aspx/detail.aspx?table={R:1}&amp;id={R:2}&amp;site=7" appendQueryString="false" />    ///手机站伪静态  url重写时传了一个参数过去。 site=7,就是手机站的ID,改成你的手机站ID
                    <conditions>
                        <add input="{HTTP_HOST}" pattern="^m.xxxxxxxxx.com" />
                    </conditions>
                </rule>
                    <rule name="手机站M" enabled="true" stopProcessing="false">    ///URL重写,m.xxxxxxxxx.com实际访问的是m.xxxxxxxxx.com/wap/,而手机站域名已经解析到主站。
                    <match url="(.*)" />
                    <conditions>
                        <add input="{HTTP_HOST}" pattern="^m.xxxxxxxxx.com$" />
                        <add input="{REQUEST_URI}" pattern="(wap|e)/" negate="true" />
                    </conditions>
                    <action type="Rewrite" url="/wap/{R:1}" appendQueryString="false" />
                </rule>
                <rule name="301" enabled="true" stopProcessing="true">
                    <match url="(.*)" />
                    <conditions logicalGrouping="MatchAll">
                        <add input="{HTTP_HOST}" pattern="^www.xxxxxxxxx.com" />
                        <add input="{REQUEST_URI}" matchType="Pattern" pattern="^/wap/$" ignoreCase="true" negate="false" />
                    </conditions>
                    <action type="Redirect" url="http://m.xxxxxxxxx.com/" appendQueryString="false" />
                </rule>
            </rules>
        </rewrite>
3、修改 /e/aspx/detail.aspx文件,把override protected void OnInit(EventArgs e),换成以下代码。
主要是给手机版加了一段判断代码和数据库查询代码,所以同理,有更多子站,就再加上一条判断代码,结合web.config中加上对应rule规则,传相应站点的site_id ,就可以实现所有子站的伪静态。

override protected void OnInit(EventArgs e)
{
  string Table=Request.QueryString["table"];
  string Id=Request.QueryString["id"];
  string site=Request.QueryString["site"];
  if(IsStr(Table) && IsNum(Id))
    {
     Conn Myconn=new Conn();
     OleDbConnection conn=Myconn.OleDbConn();//获取OleDbConnection
     conn.Open();
     string sql="select id from pa_table where thetable='"+Table+"'";
     OleDbCommand comm=new OleDbCommand(sql,conn);
     OleDbDataReader dr=comm.ExecuteReader();
     if(!dr.Read())
      {
        dr.Close();
        conn.Close();
        Response.Write("此信息未被调用!");
      }
     dr.Close();
     sql="select site_id,lanmu_id,sublanmu_id , sort_id from "+Table+" where id="+Id;
     comm=new OleDbCommand(sql,conn);
     dr=comm.ExecuteReader();
     if(dr.Read())
      {
         string sort_id=dr["sort_id"].ToString();
        if(site == null){
        Load_PageAdmin(int.Parse(dr["site_id"].ToString()),int.Parse(dr["lanmu_id"].ToString()),int.Parse(dr["sublanmu_id"].ToString()));
        }
        else
        {
            dr.Close();
            sql="select id,lanmu_id from pa_sublanmu  where sort_id= "+sort_id+" and site_id = "+site;                                  //判断是手机站的url 查询手机站的栏目id
            comm=new OleDbCommand(sql,conn);
            dr=comm.ExecuteReader();
            dr.Read();
            Load_PageAdmin(int.Parse(site.ToString()),int.Parse(dr["lanmu_id"].ToString()),int.Parse(dr["id"].ToString()));
        }
      }
     else
      {
        dr.Close();
        conn.Close();
        Response.Redirect("/");
      }
     conn.Close();
    }
  else
    {
      Response.Redirect("/");
    }
}
4、手机版中给每一个需要调用最终分类逐一分设子栏目调用
子栏目是否作为调用目标,这里选是和否都行, 原因是做了伪静态后和这个就没关系了,但是为了站点不生成静态时调试方便,还是选是较好。

到这一步卡住了好久。。。因为开始我的手机版调用的是非最终类,手机版模型没改过URL,所以导致各种不能正常伪静态和手机版调用数据。这里的关键一步,是手机站的查询sql="select id,lanmu_id from pa_sublanmu  where sort_id= "+sort_id+" and site_id = "+site; 开始觉得为什么要加sort_id呢?如果加了应该没有数据啊,后来打开pa_sublanmu表,仔细看才突然顿悟到这里的sort_id应该是数据所属最终分类的id,可数据表中的值是非最终类的id,原因是我在做手机版的时候为了方便省事,直接调用了数据大类,而不是逐一调用最终子类。

5、修改手机版中用到的相应栏目模型,模块模型。
模型中的连接地址改成, /article/detail_<%=dr["id"].ToString()%>.html,因为伪静态后的地址格式是http://m.xxxxxxxxx.com/article/detail_17509.html这样的,如果用默认地址参数的话,会导致地址格式不对。至此伪静态已基本完成,剩下一些收尾。

6、替换代码中的不合适的动态连接以及地址格式不规范,导致相对地址出错的连接。





二、PC版和手机版加入跳转代码实现PC和手机对应

1、PC版自动跳转到手机版

<!--判断手机端代码开始-->
<script src="http://siteapp.baidu.com/static/webappservice/uaredirect.js" type="text/javascript"></script>
<script type="text/javascript">
var url=location.href;
var arrUrl = url.split("_");
if (arrUrl[1]!=undefined)
{
var f='http://m.xxxxxxxxx.com/article/detail_'+arrUrl[1]
uaredirect(f);
}
else
{
var m='http://m.xxxxxxxxx.com/'
uaredirect(m);
}
</script>

以上实现了PC内容页跳转到手机内容页,其他PC栏目页跳转到手机首页,要实现各子栏目页互相跳转就再写if语句。
这里只能写绝对地址,相对地址不能实现跳转,并且要加上else分支,否则子栏目跳转提示404,另外判断非空只能用!=undefined写,因为"_"分组子栏目地址后,数组1的值为undefined,如果用arrUrl[1].length!=0,则会出错。


2、手机版跳转PC版

<script>
function openWin(obj)
{
var url=location.href;
var arrUrl = url.split("_");
if (arrUrl[1]!=undefined)
{
var b=arrUrl[1]+'#fromapp'
var a="http://www.xxxxxxxxx.com/article/detail_"
            obj.target="_self";
            obj.href = a+b;
            obj.click();
}
else
{
var c="http://www.xxxxxxxxx.com/#fromapp"
            obj.target="_self";
            obj.href = c;
            obj.click();
}
}
</script>
以上实现了手机内容页跳转到PC内容页,其他手机栏目页跳转到PC首页,要实现各子栏目页互相跳转就再写if语句。
在手机版底部加上
<a href="javascript:void(0)" class="sj_pc">电脑版</a>
分享 转发
TOP
2#

二级域名跟子目录绑定后,浏览器地址栏里的URL仍然显示子目录,这是什么问题
TOP
发新话题 回复该主题