Как узнать исходный URL после перезаписи URL? - PullRequest
6 голосов
/ 22 октября 2010

У меня есть правила перезаписи 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 иНачните URL-адрес с domain2, но мне нужен общий кусок кода, потому что эта реконструкция 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>

Спасибо

Ответы [ 2 ]

23 голосов
/ 22 октября 2010

Вы должны найти его в Request.RawUrl .

2 голосов
/ 19 сентября 2012

Вот хороший способ получить текущий каталог даже при использовании перезаписи.

Мне нужно было это для кэширования некоторых ресурсов в localStorage для автономного веб-приложения.При использовании 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/GreekBible{URL}" />
    </rule>
...