没有页面扩展名的URL重写规则

时间:2017-11-01 12:18:03

标签: c# asp.net url-rewriting c#-2.0

我在 .Net Framework 2.0 上有一个项目,其中我需要调用一些没有页面扩展名的页面,这意味着我必须从url中删除.aspx并且还需要传递一些查询字符串数据。 URL重写目前已按以下方式实现,但不会删除.aspx

<configuration>
<modulesSection>
    <rewriteModule>
      <rewriteOn>true</rewriteOn>
      <rewriteRules>
        <rule source="Admin/TheFetus/(.*)" destination="Admin/Fetus/$1"/>
        <rule source="CaseDetails/(.*).aspx" destination="Client/Cases/CaseDetails.aspx"/>
        <!--<rule source="ArticleDetails/(.*).aspx" destination="Client/Articles/ArticleDetails.aspx"/>-->
        <rule source="ArticleDetails" destination="Client/Articles/ArticleDetails.aspx"/>
        <rule source="ChapterDetails/(.*).aspx" destination="Client/Chapters/ChapterDetails.aspx"/>
        <rule source="LectureDetails/(.*).aspx" destination="Client/Lectures/LectureDetails.aspx"/>
        <rule source="ConventionDetails/(.*).aspx" destination="Client/Conventions/ConventionDetails.aspx"/>
        <rule source="IfserDetails/(.*).aspx" destination="Client/Ifser/IfserDetails.aspx"/>
        <rule source="Client/Fetus/Files/(.*)" destination="Client/Fetus/Files/$1"/>
        <rule source="Fetus/Files/(.*)" destination="Client/Fetus/Files/$1"/>
        <rule source="Client/Fetus/Index.php" destination="Client/Fetus/Home.aspx"/>
        <rule source="Fetus/Index.php" destination="Client/Fetus/Home.aspx"/>
        <rule source="Client/Fetus/(.*).php(.*)" destination="Client/Fetus/$1.aspx$2"/>
        <rule source="Fetus/(.*).php(.*)" destination="Client/Fetus/$1.aspx$2"/>
        <rule source="Admin/Fetus/(.*)" destination="Admin/Fetus/$1"/>
        <rule source="Client/Fetus/(.*)" destination="Client/Fetus/$1"/>
        <rule source="Fetus/(.*)" destination="Client/Fetus/$1"/>
        <rule source="bannerspecs" destinatiofn="Client/FooterLinks/BannerSpecs.aspx"/>
        <rule source="Client/TheFetus/Files/(.*)" destination="Client/Fetus/Files/$1"/>
        <rule source="TheFetus/Files/(.*)" destination="Client/Fetus/Files/$1"/>
        <rule source="Client/TheFetus/Index.php" destination="Client/Fetus/Home.aspx"/>
        <rule source="TheFetus/Index.php" destination="Client/Fetus/Home.aspx"/>
        <rule source="Client/TheFetus/(.*).php(.*)" destination="Client/Fetus/$1.aspx$2"/>
        <rule source="TheFetus/(.*).php(.*)" destination="Client/Fetus/$1.aspx$2"/>
        <rule source="Client/TheFetus/(.*).php(.*)" destination="Client/Fetus/$1.aspx$2"/>
        <rule source="Client/TheFetus/(.*)" destination="Client/Fetus/$1"/>
        <rule source="TheFetus/(.*)" destination="Client/Fetus/$1"/>
        <rule source="(.*)/Default.aspx" destination="Default.aspx?Folder=$1"/>
        <rule source="LATAM.aspx" destination="Client/MiniSites/MiniSiteDetails.aspx?MiniSiteId=10"/>
      </rewriteRules>
    </rewriteModule>
  </modulesSection>
</configuration>

如何通过在 .Net framework 2.0

中传递一些查询字符串参数来替换当前的web.config代码以实现不带.aspx扩展名的url重写

3 个答案:

答案 0 :(得分:2)

当你找到.aspx页面时,你直接解决它。意思是,你必须将URL作为.aspx来解决,否则它将找不到所请求的页面,因为没有任何页面。 这是MVC带来的一大优势,当你可以解决你的cshtml视图时,网址将显示 / Home / Index ,而不需要cshtml扩展。

当谈到.aspx页面时,有两种方法可以实现你的要求。

<强> Globl.asax

public class Global : System.Web.HttpApplication
{

    //Register your routes, match a custom URL with an .aspx file. 
    private void RegisterRoutes(RouteCollection routes)
    {
        routes.MapPageRoute("About", "about", "~/about.aspx");
        routes.MapPageRoute("Index", "index", "~/index.aspx");
    }

    //Init your new route table inside the App_Start event.
    protected void Application_Start(object sender, EventArgs e)
    {
        this.RegisterRoutes(RouteTable.Routes);
    } 
}  

你覆盖地图页面路由并声明没有.aspx扩展名的路由,就像MVC那样。 这称为使用Url Routing

的自定义路由处理程序

网址重写

正如您所做的那样,url通过web.config重写。

<urlMappings enabled="true">
 <add url="~/questions/ask" mappedUrl="~/questions/ask.aspx?page=Ask"/>
</urlMappings>

您使用网址映射将.aspx网址映射到新路由,这样您就可以让网页表单页面重写不带.aspx扩展名的网址。

<rule source> 

无法正常工作,因为它不会重写您的网址,它会指向您确切的文件,因此如果您不使用.aspx扩展名,则该文件不存在并引发异常。 如果要删除.aspx扩展名,则必须使用UrlMappings。

答案 1 :(得分:0)

正如我在评论中写道的那样,不清楚哪些URL应该在没有“.aspx”的情况下重定向,但是,为什么你不能为“.php”做同样的伎俩,例如

    <rule source="Client/Fetus/(.*).php(.*)" destination="Client/Fetus/$1.aspx$2"/>

因此,假设您要更改旧“Admin / TheFetus”文件夹下的网址,您可能会将第一条规则更改为:

    <rule source="Admin/TheFetus/(.*).aspx(.*)" destination="Admin/Fetus/$1$2"/>

答案 2 :(得分:0)

我认为适合您的是一个简单的自定义过滤器模块:您可以将其构建为DLL项目和目标.net 2.0 - 3.5。

这将使您能够使用所有String函数重写和重定向请求以及所有HTTP类(请求,响应等)

(由于我不明白你的重定向规则,我不能为你做那部分,但我相信你可以搞清楚)。否则请更好地解释规则,我很乐意这样做。

using System;
using System.Web;
using System.Threading;
//using System.Threading.Tasks;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace FilterModule
{
    class AspxFilter : IHttpModule
    {
        public void Init(HttpApplication app)
        {
            app.BeginRequest += new EventHandler(AspxRedirect);
        }



        private void AspxRedirect(Object s, EventArgs e)
        {
            HttpApplication app = s as HttpApplication;
            HttpRequest req = app.Request;
            HttpContext context = app.Context;

            string filePath = context.Request.FilePath;
            string fileExtension = VirtualPathUtility.GetExtension(filePath);
            string fileName = VirtualPathUtility.GetFileName(filePath);

            if (fileExtension.ToLower() == ".aspx")
            {

               if (req.QueryString["Redirect"] != null)
               {
                String RedirectPath = "Redirect.html";
                // Build your redirect Path as needed based on the rquest String
                context.Response.Redirect(RedirectPath);
                }
                else
                {
                }

            }

        }

        public void Dispose()
        {

        }

    }
}

然后,只需添加/编辑Web.Config即可实现该模块:

实施

1.将已编译的DLL(FilterModule.dll)添加到您网站的 bin 目录。

2.将以下内容添加到Web服务(或站点)配置文件(web.config)中的模块定义

<system.webServer>下的<modules>部分。

添加以下内容:

<system.webServer>
    <modules>
    <add name ="FilterModule" type="FilterModule.AspxFilter" />

更新:我已经测试了我的答案,它按预期工作。如果您在实施它时遇到任何问题,请告诉我。