2016-01-29 11 views
9

Szukam sposobu na przepisanie adresu URL, jeśli ścieżka do aplikacji w adresie URL ma inną obudowę. Ponieważ ścieżka do aplikacji może być różna dla różnych wdrożeń, muszę uzyskać do niej dynamiczny dostęp. Czy jest jakiś sposób na zrobienie tego?Moduł do aktualizacji adresu URL usługi IIS: Pobierz aplikację ApplicationPath

Tło:

ja ustawiania ścieżki ciasteczek do ścieżki aplikacji. Ponieważ w ścieżce pliku cookie rozróżniana jest wielkość liter, muszę przepisać adresy URL na wypadek, gdyby były błędnie zapisane. Chciałbym również mieć alternatywne sposoby, które nie wymagają użycia modułu przepisywania adresu URL.

Przykład

Załóżmy, że dla jednego wdrożenia, alias dla aplikacji jest „ApplicationA” (dla innego rozmieszczenia, alias może być „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 zobacz edycję. –

+0

Czy reguła zawsze zaczyna się i kończy wielkimi literami, ale środek powinien być pisany małymi literami? – NikolaiDante

+0

Nie, alias może być [A-Za-z0-9] +, a przepisanie powinno nastąpić tylko wtedy, gdy ten alias części adresu URL jest różny. –

Odpowiedz

0

Nie wiem, czy przepisać to prawidłowe działanie w przypadku, być może należy użyć odpowiedniego przekierowania (trwały), ale poniżej jest reguła, która pozwoliła mi sprowadzić nazwa aplikacji w konkretnym przypadku:

<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

Tak więc, jeśli wirtualna ścieżka do aplikacji internetowej to "TmP", tylko wtedy zadziała, prawda? –

+0

Tak, w przeciwnym razie przekieruje się do TmP – Uriil

0

myślę tworzenie i dodawanie niestandardowego Http Module może rozwiązać Twój problem. Moduł HTTP jest wywoływany na każde żądanie w odpowiedzi na zdarzenia BeginRequest i EndRequest.

Możesz uzyskać dostęp do adresu URL dynamicznie i przekierować go, zmieniając jego wielkość liter.

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

Updated

Mogę zaproponować subskrybować przypadku BeginRequest przy użyciu HttpModule.

Metodą RewritePath zyskałbyś na prędkości w stosunku do Redirect, gdzie wystarczy dopasować i przepisać adres URL, jeśli obudowa jest nieprawidłowa, ... lub w rzeczywistości po prostu dostosować obudowę może być szybszy niż najpierw ją sprawdzić, a następnie dostosować (przetestuj i zobacz zanim wybierzesz rozwiązanie).

Pozytywnym efektem ubocznym jest można łatwo umieścić w innych testów i uczynić wyjątki itd

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() 
    { 

    } 
} 

Notatka:

Nadal zalecamy użycie niższą ścieżkę w pierwszym przypadku miejsce.

0

Po prostu myśl, jeśli rozważyć rezygnację z notacji wielbłąda (ApplicationA) na rzecz wymuszenia na przykład małej litery * (applicationa), można użyć słowa kluczowego ToLower, jak poniżej.

<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> 

* Jeśli są zobowiązane do oryginalnej notacji CamelCase w url to bym odroczyć do podejścia Uriil za wyżej.

Powiązane problemy