首页 > 代码库 > 记一次Url重写_发布之后iis 404

记一次Url重写_发布之后iis 404

    把api封装完,客户要求app的url能不能不变(客户之前用的php的api开发app,已经开发了很多了,所以希望不改动url)。但是这个规则要求是:xx/api.php?s=/{controller}/{action}&{parms},而我的直接就是xx/{controller}/{action} ?parms。改动web api的路由却不能包含“?”这个特殊字符。而且api.php之后都是参数,而我action之后才是参数。所以必须重写Url。

 public class UrlWriter : IHttpModule    {        public void Init(HttpApplication context)        {            context.BeginRequest += new EventHandler(context_BeginRequest);        }        void context_BeginRequest(object sender, EventArgs e)        {            //获得当前页面请求管道的HttpApplication对象            HttpApplication application = sender as HttpApplication;            HttpContext context = application.Context;//获得上下文对象            //string url = context.Request.Url.LocalPath;//获得URL(不包含域名和路径)            string url = context.Request.Url.AbsoluteUri;//获得URL(不包含域名和路径)            //api.php?s= /controller/action&name=miyu&pwd=123 ---> controller/action?parms=            Regex reg1 = new Regex("/WebForm2/[A-Z0-9a-z_]+");//注意文件夹与文件名称的大小写.            if (url.Contains("api.php?s=")) //这种情况是匹配根据ID值来查看某个文章的内容。            {                url = url.Replace("api.php?s=", "|");                var controller = "";                var action = "";                var parms = "";                var baseurl = url.Split(|)[1]; //得到 类似于User/Login&.... 或者 User/Login ....                if (baseurl.Contains("&"))                {                    var cap = baseurl.Split(&);                    var ca = cap[0].Split(/);                    controller = ca[0];                    action = ca[1];                    //User/login&name=miyu&pwd=123                    parms = "?";                    for (int i = 1; i <= cap.Length-1; i++)                    {                        if (i < cap.Length - 1) //共有cap.length-1个参数                        {                            parms += cap[i] + "&";                        }                        else                        {                            parms += cap[i] ;//最后一个参数 不需要再加&                         }                    }                }                else                {                    var ca = baseurl.Split(/);                    controller = ca[0];                    action = ca[1];                }                var newurl = string.Format("/api/{0}/{1}{2}", controller, action, parms);                context.RewritePath(newurl); //前台的列表页就可以这样写:<a href=http://www.mamicode.com/‘../WebForm2/<%#Eval("id")%>‘></a>            }                    }        public void Dispose()        {            throw new NotImplementedException();        }    }

 然后在web.config中加入:

 <httpModules>      <add name="UrlReWriter" type="AS.GroupOn.Web.UrlWriter, AS.GroupOn.Web, Version=1.0.0.0, Culture=neutral" />    </httpModules>  </system.web>

Debug的时候就ok了。但发布上了iis 却404 找不到资源。因为iis将.php 识别成了一个资源文件。

最后找到方法:站点--> 属性--》主目录

点击配置:

可执行文件就是我们的C:\WINDOWS\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll。 (32位选32位的)

扩展名加入 .php

 

取消判断确认文件是否存在 就ok了。

 

记一次Url重写_发布之后iis 404