【问题标题】:URL Rewrite Rule without page extension没有页面扩展的 URL 重写规则
【发布时间】:2018-04-13 18:12:23
【问题描述】:

我有一个关于 .Net Framework 2.0 的项目,其中我需要调用一些没有页面扩展名的页面,这意味着我必须从 url 中删除 .aspx 并且我还需要传递一些 Query字符串数据。 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重写

【问题讨论】:

  • 不清楚需要将哪些 URL 重定向到没有 .aspx 的 URL。你可以再详细一点吗?我希望这些不是所有 URL,因为您在很多 destinations 中明确添加了“.aspx”。
  • 您是否尝试过这篇文章中建议的解决方案:stackoverflow.com/questions/4481632/…。这应该是您的首选,因为您使用的是 .Net 2.0。
  • "通过传递一些查询字符串参数" 你是说你想在重定向请求中附加一些查询字符串参数吗? (一旦收到请求?)

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


【解决方案1】:

当您寻址 .aspx 页面时,您直接寻址它。这意味着,您必须将 url 寻址为 .aspx,否则它将找不到请求的页面,因为没有任何页面。 这是 MVC 带来的一大优势,当您可以处理您的 cshtml 视图并且 url 将显示 /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

网址重写

和你一样,通过 web.config 重写 url。

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

您使用 url 映射将 .aspx url 映射到新路由,这样您的 Web 表单页面就可以在没有 .aspx 扩展名的情况下重写 url。

<rule source> 

不起作用,因为它不会重写您的 url,它会将您定向到确切的文件,因此如果您不使用 .aspx 扩展名,则该文件不存在并引发异常。 如果要删除 .aspx 扩展名,则必须使用 UrlMappings。

【讨论】:

    【解决方案2】:

    正如我在评论中所写的,不清楚哪些 URL 应该在没有“.aspx”的情况下重定向,但是,为什么你不能做你已经为“.php”做的同样的把戏,比如在

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

    因此,假设您想更改旧的“Admin/TheFetus”文件夹下的 URL,您可以将第一条规则更改为:

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

    【讨论】:

    • 在这一行中,新的 url 将具有 . aspx 扩展名,我不想要。
    • 我试过这个 但是我得到 404 - File or directory not found 错误当我打电话给客户端/CME/CMEPortal.aspx 页面。
    • @AnimeshAnand,显而易见的问题是:如果您直接打开Client/CME/CMEPortal(即没有.aspx),它是否有效?您在这里的路由可能会遇到不同的问题。
    • 不,它不适用于 Client/CME/CMEPortal ,我使用的是 .Net 框架 2.0,可能会导致什么问题?我不知道
    【解决方案3】:

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

    这将使您能够使用所有字符串函数以及所有 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 Service(或站点)配置文件(web.config)中的模块定义中添加如下内容

    &lt;modules&gt; 下的&lt;system.webServer&gt; 部分中。

    添加以下内容:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-24
      • 2013-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 2015-10-23
      相关资源
      最近更新 更多