url重写后如何知道原始url?

Posted

技术标签:

【中文标题】url重写后如何知道原始url?【英文标题】:How to know the original url after url rewrite? 【发布时间】:2011-04-28 20:08:43 【问题描述】:

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

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

www.domain2.com/controller/action

urlrewrite 成功了:

www.domain1.com/subproject/controller/action

我希望重建原始网址:

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>

谢谢

【问题讨论】:

【参考方案1】:

即使在使用重写时,这是获取当前目录的好方法。

我需要它来缓存 localStorage 中的一些资源,以用于离线 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;

我花了很多时间才弄明白。这是使用我的网站的示例:

没有重写器的路径

    //  applicationRoot         = http://www.toldpro.com/
    //  rawURl                  = /Apps/GreekBible/App/A/B/C
    //  rawUrlAbsolute          = http://www.toldpro.com/Apps/GreekBible/App/A/B/C 
    //  relativeToCurrentPath   = ../../../
    //  clientPathAbsolute      = http://www.toldpro.com/Apps/GreekBible/
    //  clientPathAbsoulteStr   = http://www.toldpro.com/Apps/GreekBible/

重写到子域的路径

    //  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/GreekBibleURL" />
    </rule>

【讨论】:

这花了我好几个小时才解决,所以我认为有人可以使用它。【参考方案2】:

你应该可以在Request.RawUrl找到它。

【讨论】:

谢谢,它有效。出于好奇,原始域是否丢失了,或者我也可以在某个地方找回它? @Nicholas,我不知道我的头顶,但我确信它必须Params的某个地方@:msdn.microsoft.com/en-us/library/…跨度> 它实际上在 Request.ServerVariables("HTTP_X_REWRITE_URL") 中,我确信 Request.RawUrl 只是映射到那个。 ;-) @CrazyDart,是的,ServerVariables 也在Params 中;-) @CrazyDart,经过一番谷歌搜索,似乎 HTTP_X_REWRITE_URL 是非标准的(我在本地尝试过,它返回空字符串)。使用 Reflector,我看到 RawUrl 查看了 CACHE_URL 服务器变量(在本地它运行良好并且包含原始域,但它不在 Params 中)。使用这个安全吗?

以上是关于url重写后如何知道原始url?的主要内容,如果未能解决你的问题,请参考以下文章

如何用我的案例重写URL

thinkphp在iis下如何写规则url重写

使用 htaccess 重写后,如何在 PHP 中获取可见 URL(不是实际 URL)? [复制]

如何找到当前 url 被重写?

如何配置iis rewrite模块的url重写规则

Java过滤器URL重写循环问题