Asp.net mvc 如何知道url重写后的原始url?
我有url重写规则,可以将www.domain2.com重定向到domain1.com根目录下的子文件夹(我们称此文件夹为子项目)。在我的控制器中,我需要构造一个指向原始未修改路径的URL,但Request.URL属性(如AbsoluteUri或LocalPath)始终包含子项目子文件夹 换句话说,如果用户键入:Asp.net mvc 如何知道url重写后的原始url?,asp.net-mvc,iis-7,url-rewriting,Asp.net Mvc,Iis 7,Url Rewriting,我有url重写规则,可以将www.domain2.com重定向到domain1.com根目录下的子文件夹(我们称此文件夹为子项目)。在我的控制器中,我需要构造一个指向原始未修改路径的URL,但Request.URL属性(如AbsoluteUri或LocalPath)始终包含子项目子文件夹 换句话说,如果用户键入: www.domain2.com/controller/action urlrewrite使其: www.domain1.com/subproject/controller/actio
www.domain2.com/controller/action
urlrewrite使其:
www.domain1.com/subproject/controller/action
我希望重建原始url:
www.domain2.com/controller/action
我可以硬编码从url中删除子项目,并以domain2开始url,但我需要一段通用代码,因为此url重建将在可重用库中进行。domain2可能在我的应用程序的设置中,但子文件夹呢
在参考中,以下是重写规则:
<rewrite>
<rules>
<rule name="Redirect to subproject">
<match url=".*" />
<conditions>
<add input="{HTTP_HOST}" pattern="^(www.)?domain2.com" />
<add input="{PATH_INFO}" pattern="^/subproject/" negate="true" />
</conditions>
<action type="Rewrite" url="\subproject\{R:0}" />
</rule>
</rules>
</rewrite>
谢谢您应该可以在中找到它。即使使用“重写”,这里也是获取当前目录的好方法 我需要它来缓存本地存储中的一些资源,以用于离线web应用程序。使用asp.net mvc,页面参数将作为子目录写入页面下,从而导致相对路径发生更改。因此,我需要绝对路径作为localStorage中资源的密钥 无论如何,这是:
var applicationRoot = new System.Uri(Request.Url, Href("~"));
var rawURl = Request.RawUrl;
var rawUrlAbsolute = new System.Uri(serverRoot, rawURl);
var relativeToCurrentPath = Href("SOMETHING_DOESNT_MATTER/../");
var clientPathAbsolute = new System.Uri(rawUrlAbsolute, relativeToCurrentPath);
var clientPathAbsoulteStr = clientPathAbsolute.AbsoluteUri;
我花了很多时间才弄明白。以下是使用我的网站的示例:
没有重写器的路径
重写到子域的路径
重写规则:
有关这方面的更多信息,以下是我使用的重写规则:
// Rewrite:
// http://greekbible.toldpro.com/App/* (Client)
// to
// http://www.toldpro.com/Apps/GreekBible/App/* (Actual)
<rule name="Subdomain rewriter" stopProcessing="true">
<match url="App/(.*)" />
<conditions>
<add input="{HTTP_HOST}" pattern="^www\.toldpro\.com$" negate="true" />
<add input="{HTTP_HOST}" pattern="^greekbible\.toldpro\.com$" />
</conditions>
<action type="Rewrite" url="/Apps/GreekBible{URL}" />
</rule>
//重写:
// http://greekbible.toldpro.com/App/*(客户)
//到
// http://www.toldpro.com/Apps/GreekBible/App/*(实际)
谢谢,它很有效。出于好奇,原始域丢失了吗?或者我还能在某个地方找回它吗?@Nicholas,我不知道我的想法,但我确信它一定在Params
的某个地方:它实际上在Request.ServerVariables(“HTTP\u X\u REWRITE\u URL”)中,我确信Request.RawUrl正好映射到了这一点。;-)@CrazyDart、yes和服务器变量也在参数中@CrazyDart,在谷歌搜索之后,似乎HTTP_X_REWRITE_URL是非标准的(我在本地尝试过,它返回空字符串)。使用Reflector,我看到RawUrl查看CACHE_URL服务器变量(在本地,它运行良好,包含原始域,但不在Params中)。使用这个安全吗?我花了很多时间来解决这个问题,所以我想有人可以使用它。
// applicationRoot = http://greekbible.toldpro.com/Apps/GreekBible/
// rawURl = /App/A/B/C
// rawUrlAbsolute = http://greekbible.toldpro.com/App/A/B/C
// relativeToCurrentPath = ../../../Apps/GreekBible/
// clientPathAbsolute = http://greekbible.toldpro.com/Apps/GreekBible/
// clientPathAbsoulteStr = http://greekbible.toldpro.com/Apps/GreekBible/
// Rewrite:
// http://greekbible.toldpro.com/App/* (Client)
// to
// http://www.toldpro.com/Apps/GreekBible/App/* (Actual)
<rule name="Subdomain rewriter" stopProcessing="true">
<match url="App/(.*)" />
<conditions>
<add input="{HTTP_HOST}" pattern="^www\.toldpro\.com$" negate="true" />
<add input="{HTTP_HOST}" pattern="^greekbible\.toldpro\.com$" />
</conditions>
<action type="Rewrite" url="/Apps/GreekBible{URL}" />
</rule>