我在 .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重写答案 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" />
更新:我已经测试了我的答案,它按预期工作。如果您在实施它时遇到任何问题,请告诉我。