在使用 IIS7 rewrite module 的 ASP.NET 中,您将使用如下内容:
<rewrite>
<rules>
<rule name="Rewrite to category.aspx">
<match url="^([0-9]+)/category.aspx" />
<action type="Rewrite" url="category.aspx?id={R:1}" />
</rule>
<rule name="Rewrite to product.aspx">
<match url="^(.*)/product.aspx" />
<action type="Rewrite" url="product.aspx?cat={R:1}" />
</rule>
</rules>
</rewrite>
更新 意识到你不能像我最初展示的那样将路由变量作为querystring 和MapPageRoute 传递。事实上,如果你想这样做,事情就会变得棘手。我能想到的有 2 个选项。
选项 1)
使用以下路线。
routes.MapPageRoute(
"category",
"{category}/category.aspx",
"category.aspx"
);
然后在您的category.aspx 中使用以下代码而不是querystring 来提取类别值。
ControllerContext.RouteData.Values["category"];
选项 2)
这涉及创建自定义处理程序,以便在重写路径时将 RouteData 重写为 querystring。
public class PageRouteWithQueryStringHandler : PageRouteHandler
{
public RouteWithQueryHandler(string virtualPath, bool checkPhysicalUrlAccess)
: base(virtualPath, checkPhysicalUrlAccess)
{
}
public RouteWithQueryHandler(string virtualPath)
:base(virtualPath)
{
}
public override IHttpHandler GetHttpHandler(RequestContext requestContext)
{
var request = requestContext.HttpContext.Request;
var query = HttpUtility.ParseQueryString(request.Url.Query);
foreach (var keyPair in requestContext.RouteData.Values)
{
query[HttpUtility.UrlEncode(keyPair.Key)] = HttpUtility.UrlEncode(
Convert.ToString(keyPair.Value));
}
var qs = string.Join("&", query);
requestContext.HttpContext.RewritePath(
requestContext.HttpContext.Request.Path, null, qs);
return base.GetHttpHandler(requestContext);
}
}
这可以注册如下。
routes.Add("category", new Route("{category}/category.aspx",
new PageRouteWithQueryStringHandler ("~/category.aspx", true)));