2016-01-29 3 views
9

Я ищу способ переписать URL-адрес, если путь приложения в URL-адресе имеет другой корпус. Поскольку путь приложения может меняться для разных развертываний, мне нужно получить доступ к нему динамически. Есть ли способ сделать это?IIS Url Rewrite Module: Get ApplicationPath

фон:

Я устанавливаю путь печенья на путь приложения. Поскольку путь cookie чувствителен к регистру, мне нужно переписать URL-адреса, если они ошибочно установлены. Я также хотел бы иметь альтернативные способы, которым не нужно использовать модуль перезаписи URL.

Пример

Давайте предположим, что для одного развертывания, псевдоним для приложения «ApplicationA» (для другого развертывания, псевдоним может быть «ApplicationB»).

http://<host>:<port>/<applicationA or Applicationa or APPLicationA etc.>/<rest of the url> 

Redirect to 

http://<host>:<port>/ApplicationA/<rest of the url> 
+0

@NikolaiDante см. Редактирование. –

+0

Правило всегда будет начинаться и заканчиваться буквой в верхнем регистре, но середина должна быть строчной буквы? – NikolaiDante

+0

Нет, псевдоним может быть [A-Za-z0-9] +, и переписывание должно происходить только тогда, когда эта псевдонима части URL-адреса в другом случае. –

ответ

0

Не уверен, что если REWRITE правильная операция в вашем случае, может быть, вы должны использовать REDIRECT (постоянный), но ниже, правило, которое позволило мне получать имя приложения в конкретном случае:

<system.webServer> 
    <rewrite> 
     <rules> 
      <rule name="My Rule" stopProcessing="true"> 
       <match url="^(.+)" ignoreCase="false" /> 
       <conditions> 
        <add input="{REQUEST_URI}" pattern="TmP/.+" ignoreCase="false" negate="true" /> 
        <add input="{REQUEST_URI}" pattern="tmp/(.+)" ignoreCase="true" /> 
       </conditions> 
       <action type="Redirect" url="TmP/{C:1}" /> 
      </rule> 
     </rules> 
    </rewrite> 
</system.webServer> 
+0

Итак, если виртуальный путь для веб-приложения «TmP», только тогда он будет работать, правильно? –

+0

Да, иначе мудрый будет перенаправлен на TmP – Uriil

0

Я думаю, создание и добавление пользовательского Http Module может решить вашу проблему. HTTP-модуль вызывается по каждому запросу в ответ на события BeginRequest и EndRequest.

Динамический доступ к URL-адресу и его перенаправление путем изменения его кода.

private void PreRequestHandlerExecute(object sender, EventArgs e) 
    { 
     HttpApplication app = sender as HttpApplication; 
     var f = req.Url; 
     f="Change case of URL"; 
     if (condition) 
     { 

      app.Response.Redirect(f); 
     } 

    } 
0

Обновлено

Могу ли я предложить вам подписаться на BeginRequest события с помощью HttpModule.

С RewritePath методом вы бы получить скорость против Redirect, где вы просто сопрягать и переписать URL, если корпус не так, ... или на самом деле просто отрегулировать корпус может быть быстрее, чем проверить его первым, а затем настроить (проверить и посмотреть, прежде чем выбрать решение).

Положительный побочный эффект вы можете легко положить в других тестах и ​​делают исключения и т.д.

public class AdjustCasingModule : IHttpModule 
{ 
    public void Init(HttpApplication application) 
    { 
     application.BeginRequest += OnBeginRequest; 
    } 

    protected void BeginRequest(object sender, EventArgs e) 
    { 
     var httpContext = ((HttpApplication)sender).Context; 

     string[] path = httpContext.Request.Path.Split('/'); 

     if (path[1].Length > 0) 
     { 
      Regex rgx = new Regex(@"^[A-Z][a-z]*[A-Z]"); 

      if (!rgx.IsMatch(path[1])) 
      { 
       char[] a = path[1].ToLower().ToCharArray(); 
       a[0] = char.ToUpper(a[0]); 
       a[char.Length - 1] = char.ToUpper(a[char.Length - 1]); 
       path[1] = new string(a); 
       httpContext.RewritePath(String.Join('/', path)); 
      } 
     } 
    } 

    public void Dispose() 
    { 

    } 
} 

Примечание стороны:

Я все еще рекомендую использовать нижний путь дела в первой место.

0

Просто подумайте, можно ли отказаться от обозначения случая верблюда (ApplicationA) в пользу принудительного, например, нижнего регистра * (applicationa), вы можете использовать ключевое слово ToLower, как показано ниже.

<system.webServer> 
    <rewrite> 
     <rules> 
      <rule name="force lowercase" stopProcessing="true"> 
       <match url="(.*)" /> 
       <conditions> 
        <add input="{URL}" pattern="[A-Z]" ignoreCase="false" /> 
       </conditions> 
       <action type="Redirect" url="{ToLower:{URL}}" redirectType="Temporary" /> 
      </rule> 
     </rules> 
    </rewrite> 
</system.webServer> 

* Если вы привержены к исходному верблюжьего записи в URL, то я уступаю подход Уриил в выше.