我有一个使用IIS 6和7的当前系统,用.NET 4中的C#编写。
我的目的是完全隐藏网址(根据客户要求)。即https://myapp.it.mydomain.com/Secure/folder1/folder2/folder3/someView.aspx必须是https://myapp.it.mydomain.com/或至少是一个不确定的不变页:https://myapp.it.mydomain.com/constantView.aspx
目前,我们使用Response.Redirect
用于所有导航项目和一些直接链接。我们也有一些次要的查询字符串用法,但更依赖于跨页回发。我们没有任何URL屏蔽方法,并且正在寻求提供这样做的机制。
我已经知道了一些执行URL屏蔽的方法,但是想要SO最简单的实现解决方案。
最简单,指的是实施时间。即更改我们的调用以独占使用Server.Transfer不是一个选项。
ASP.NET Routing
似乎是一个公平的解决方案,但需要按照我的理解处理所有查询字符串,以映射我们需要它们的位置。我不清楚这是否可以为所有页面提供隐藏而不是一对一映射。
使用framesets / iFrames也不是一种选择,因为它会导致现有解决方案出现许多复杂情况。
据我了解,URL Rewrite Module
可能是我最好的解决方案。
我希望这个问题可以导致一个很好的解决方案列表,也许还有我尚未意识到的方法。
编辑
目前情况更明确的问题:
我们正在使用IIS 6(因此IIS 7重写模块是不可能的)。有没有办法提供URL隐藏/屏蔽,它不会破坏使用Page.Referrer(在ASP.NET中)和查询字符串的现有代码?
我们的想法是使地址栏看起来始终相同。即使是JavaScript破解也是可以接受的。
您可以在此处找到适合您目的的所有可能解决方案:http://weblogs.asp.net/scottgu/archive/2007/02/26/tip-trick-url-rewriting-with-asp-net.aspx
但根据您的要求,我个人认为URL重写是您最好的选择,因为您只需要在web.config文件中添加重写规则,因此它是最容易实现的解决方案。对于IIS6,我自己过去使用过Intelligencia UrlRewriter.NET
有点不清楚...我打算使用评论,但这个“评论”的长度不会...
恕我直言:
response.redirect
是它当前如何满足要求,那么(猜测)似乎说,重定向取决于一些查询值。如果是这样,“隐藏”并不真正起作用 - 我可以简单地提供相同的查询以获得相同的结果(ing)页面(?)。server.transfer
相同 - 它在任何情况下都是“可重复的”(所以无论它应该隐藏的是什么,都不是真的被隐藏(除非我完全错过了问题的要点)。如果您解释了需要隐藏的内容以及原因,也许会更好。网址只是'某事'的资源 - 所以看来你真的需要保护那些“东西”,而不是真正的网址本身(?)。你可能会得到更好的建议......
一些想法(“简单”是相对的):
尽管如此,以上所有内容都没有通过“不可重复”的测试而不添加更多东西 - 例如RECAPTCHA,您应该问自己是否适合所有用户。在某些时候,如果它不是“公开”,那么认证就成了答案。
心连心...
更新:
嗯 - 谁知道为什么人们投票并且无话可说:)
无论如何,并非没有更好地了解真正受到保护的东西。如果必须隐藏URI,那么2层结构 - (1)前端,(2)后端是我个人的选择。这可能意味着Web服务架构。
如果我过度思考这个问题,并且它在网址中的某个“机密”名称(不是真正的流程),那么DNS可能是一个简单的解决方案(CNAME)。
Server.Transfer是维护相同网址的最佳方式,但在您的情况下,它不是一个选项。另一种方法是在主页面中加载动态用户控件。
通过动态用户控制,您可以控制要在页面中显示的内容,但我认为这是您所拥有的内容的突破性解决方案。网址重写和路由,你将有不同的网址,你将不会保持相同的网址。考虑到你想从url输入页面。在.net路由中,url必须是唯一的,禁止两个具有相同url的路由。
如果你想操纵现在实现的东西,最好的解决方案是url rewrite。
您可以使用ASP.NET 3.5版本中提供的Webforms和MVC Routing功能
这里有一些例子:
Void RegisterRoutes(RouteCollection routes)
{
Routes.MapPageRoute(
“product-browse”, // route name
“products/{category}”, // URL with params
“~/Products.apsx” // Web forms page to handle it
);
}
Void Application_Start()
{
Registerroutes(RouteTable.Routes);
RouteTable.Routes.MapPageRoute("Product", "Product/{Name}", "~/Product.aspx"
// or simply
routes.MapPageRoute("Customers", "Customers", "~/Customers.aspx");
routes.MapPageRoute("CustomerDetails", "Customers/{CustomerId}", "~/CustomerDetails.aspx");
}
// here how you can get url
string url = Page.GetRouteUrl(“product-browse”, new { category = “software”});
string name = Page.RouteData.Values["name"].ToString();
// This some webform aspx syntax of use:
<asp:HyperLink ID="hyper" runat="server"NavigateUrl='<%# "Product/laptop"%>' Text='<%# Bind("ProdctName") %>' ></asp:HyperLink>
<img src="<%= Page.ResolveUrl("Styles/Images/Product.jpg") %>" height="65px" width="65px" />
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false">
<Columns>
<asp:BoundField DataField="Id" HeaderText="Id" ItemStyle-Width="30" />
<asp:BoundField DataField="Name" HeaderText="Name" ItemStyle-Width="150" />
<asp:BoundField DataField="Country" HeaderText="Country" ItemStyle-Width="150" />
<asp:HyperLinkField Text = "View" DataNavigateUrlFormatString = "~/Customers/{0}" DataNavigateUrlFields = "Id" />
</Columns>
</asp:GridView>
不要使用UrlRewriter.NET。这是旧技术。 MVC也更喜欢Routing 4.0