• 记一次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='../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:WINDOWSMicrosoft.NETFramework64v4.0.30319aspnet_isapi.dll。 (32位选32位的)

    扩展名加入 .php

     

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

  • 相关阅读:
    云计算和大数据时代网络技术揭秘(八)数据中心存储FCoE
    云计算和大数据时代网络技术揭秘(七)大二层网络
    云计算和大数据时代网络技术揭秘(六)LISP协议
    云计算和大数据时代网络技术揭秘(五)可靠的网络
    云计算和大数据时代网络技术揭秘(四)网络加密
    云计算和大数据时代网络技术揭秘(三)安全的网络准入
    python3练习100题——027
    python3练习100题——026
    python3练习100题——025
    python3练习100题--024
  • 原文地址:https://www.cnblogs.com/stoneniqiu/p/3933137.html
Copyright © 2020-2023  润新知