Asp.net mvc 如何知道url重写后的原始url?

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

我有url重写规则,可以将www.domain2.com重定向到domain1.com根目录下的子文件夹(我们称此文件夹为子项目)。在我的控制器中,我需要构造一个指向原始未修改路径的URL,但Request.URL属性(如AbsoluteUri或LocalPath)始终包含子项目子文件夹

换句话说,如果用户键入:

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>