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?的主要内容,如果未能解决你的问题,请参考以下文章