[英]IIS Rewrite changing ASP.Net HyperLink Backend Bind
我快疯了,也许这里有人可以帮我解决这个问题。
简单的重写规则:
<rule name="Pages Rewrite" enabled="true" stopProcessing="true">
<match url="^(.*?)/$" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false">
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
</conditions>
<action type="Rewrite" url="pages/{R:1}.aspx" />
</rule>
它工作正常。
所以我们把 example.com/pages/apage.aspx 改写为 example.com/apage/
一切都按预期工作。 在此页面上,我们有一个 ASP 超链接(或带有 runat=server 的标准 A 链接)
但是当绑定时:
HL_CustomizeCollapse.NavigateUrl = "#sample";
而不是 href 是 example.com/apage/#sample href 被设置为:example.com/pages/#sample
因此,当从代码隐藏设置链接时,重写规则会影响 href。 任何设置在正面的链接都很好。 出站规则将按预期更改这些规则。
该标签不受出站规则影响,受入站规则影响。
我不知道如何解决这个问题。
HyperLink.NavigateUrl
和a.href
设置器都使用Control.ResolveClientUrl()
来确定相对路径的绝对路径。
另一方面, Control.ResolveUrl()
使用当前模板的源虚拟目录(即 /aPage)来构建绝对路径。
因此,当请求路径/pages/apage.aspx
被重新写入/apage/
,执行以下代码作为结果:
<div>
<asp:HyperLink ID="asp_hyperlink_to_default_aspx" runat="server">
asp_hyperlink_to_default_aspx
</asp:HyperLink><br />
<asp:HyperLink ID="asp_hyperlink_to_resolve_client_url_default_aspx" runat="server">
asp_hyperlink_to_resolve_client_url_default_aspx
</asp:HyperLink><br />
<asp:HyperLink ID="asp_hyperlink_to_resolve_url_default_aspx" runat="server">
asp_hyperlink_to_resolve_url_default_aspx
</asp:HyperLink><br />
</div>
Response.Write("<pre>");
Response.Write("ResolveClientUrl(\"Default.aspx\") = " + ResolveClientUrl("Default.aspx") + "<br/>");
Response.Write("ResolveUrl(\"Default.aspx\") = " + ResolveUrl("Default.aspx") + "<br/>");
Response.Write("<br/>");
Response.Write("Request.RawUrl = " + Request.RawUrl + "<br/>");
Response.Write("Request.Url.AbsolutePath = " + Request.Url.AbsolutePath + "<br/>");
Response.Write("Request.AppRelativeCurrentExecutionFilePath = " + Request.AppRelativeCurrentExecutionFilePath + "<br/>");
asp_hyperlink_to_default_aspx.NavigateUrl = "Default.aspx";
asp_hyperlink_to_resolve_client_url_default_aspx.NavigateUrl = ResolveClientUrl("Default.aspx");
asp_hyperlink_to_resolve_url_default_aspx.NavigateUrl = ResolveUrl("Default.aspx");
Response.Write("</pre>");
生成以下输出:
ResolveClientUrl("Default.aspx") = Default.aspx
ResolveUrl("Default.aspx") = /aPage/Default.aspx
Request.RawUrl = /pages/apage.aspx
Request.Url.AbsolutePath = /aPage/default.aspx
Request.AppRelativeCurrentExecutionFilePath = ~/aPage/default.aspx
<div>
<a id="ContentPlaceHolder1_asp_hyperlink_to_default_aspx" href="Default.aspx">
asp_hyperlink_to_default_aspx
</a><br />
<a id="ContentPlaceHolder1_asp_hyperlink_to_resolve_client_url_default_aspx" href="Default.aspx">
asp_hyperlink_to_resolve_client_url_default_aspx
</a><br />
<a id="ContentPlaceHolder1_asp_hyperlink_to_resolve_url_default_aspx" href="/aPage/Default.aspx">
asp_hyperlink_to_resolve_url_default_aspx
</a><br />
</div>
因此,为了保险起见,最好使用 ResolveUrl() 分别设置 HyperLink 和 A 的NavigationUrl
和href
属性。
希望这可以帮助。
祝你好运。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.