rewriter - url rewrite 2 iis




Come configurare IIS per l'URL Riscrivere un'applicazione AngularJS in modalità HTML5? (4)

Il modo più semplice che ho trovato è solo quello di reindirizzare le richieste che attivano il 404 al client. Questo viene fatto aggiungendo un hashtag anche quando è impostato $locationProvider.html5Mode(true) .

Questo trucco funziona per gli ambienti con più applicazioni Web sullo stesso sito Web e richiede vincoli di integrità dell'URL (ad esempio autenticazione esterna). Ecco come fare passo dopo passo

index.html

Imposta correttamente l'elemento <base>

<base href="@(Request.ApplicationPath + "/")">

web.config

Innanzitutto reindirizzare 404 a una pagina personalizzata, ad esempio "Home / Errore"

<system.web>
    <customErrors mode="On">
        <error statusCode="404" redirect="~/Home/Error" />
    </customErrors>
</system.web>

Home controller

Implementa un semplice ActionResult per "tradurre" l'input in un percorso clientide.

public ActionResult Error(string aspxerrorpath) {
    return this.Redirect("~/#/" + aspxerrorpath);
}

Questo è il modo più semplice.

È possibile (consigliabile?) Migliorare la funzione Error con alcune logiche migliorate per reindirizzare 404 al client solo quando url è valido e lasciare il trigger 404 normalmente quando non si troverà nulla sul client. Diciamo che hai questi percorsi angolari

.when("/", {
    templateUrl: "Base/Home",
    controller: "controllerHome"
})
.when("/New", {
    templateUrl: "Base/New",
    controller: "controllerNew"
})
.when("/Show/:title", {
    templateUrl: "Base/Show",
    controller: "controllerShow"
})

Ha senso reindirizzare l'URL al client solo quando inizia con "/ Nuovo" o "/ Mostra /"

public ActionResult Error(string aspxerrorpath) {
    // get clientside route path
    string clientPath = aspxerrorpath.Substring(Request.ApplicationPath.Length);

    // create a set of valid clientside path
    string[] validPaths = { "/New", "/Show/" };

    // check if clientPath is valid and redirect properly
    foreach (string validPath in validPaths) {
        if (clientPath.StartsWith(validPath)) {
            return this.Redirect("~/#/" + clientPath);
        }
    }

    return new HttpNotFoundResult();
}

Questo è solo un esempio di logica migliorata, ovviamente ogni applicazione web ha esigenze diverse

Ho il progetto seme AngularJS e ho aggiunto

$locationProvider.html5Mode(true).hashPrefix('!');

nel file app.js. Voglio configurare IIS 7 per indirizzare tutte le richieste a

http://localhost/app/index.html

in modo che questo funzioni per me. Come faccio a fare questo?

Aggiornare:

Ho appena scoperto, scaricato e installato il modulo Riscritto URL IIS , sperando che questo renderà più facile e ovvio il raggiungimento del mio obiettivo.

Aggiornamento 2 :

Immagino che questo riassuma ciò che sto cercando di ottenere (tratto dalla documentazione di AngularJS Developer ):

L'utilizzo di questa modalità richiede la riscrittura degli URL sul lato server, in pratica devi riscrivere tutti i tuoi link al punto di ingresso della tua applicazione (ad es. Index.html)

Aggiornamento 3:

Ci sto ancora lavorando e mi rendo conto che NON devo reindirizzare (avere regole che riscrivano) certi URL come

http://localhost/app/lib/angular/angular.js
http://localhost/app/partials/partial1.html

quindi tutto ciò che è nelle directory css, js, lib o partial non viene reindirizzato. Tutto il resto dovrà essere reindirizzato ad app / index.html

Qualcuno sa come raggiungerlo facilmente senza dover aggiungere una regola per ogni singolo file?

Aggiornamento 4:

Ho 2 regole in entrata definite nel modulo Riscrivi URL IIS. La prima regola è:

La seconda regola è:

Ora quando navigo su localhost / app / view1 carica la pagina, tuttavia i file di supporto (quelli nelle directory css, js, lib e partials) vengono riscritti anche alla pagina app / index.html - quindi tutto sta arrivando indietro come la pagina index.html indipendentemente dall'URL utilizzato. Immagino che questo significhi che la mia prima regola, che dovrebbe impedire che questi URL vengano elaborati dalla seconda regola, non funziona ... qualche idea? ... qualcuno? ...Mi sento così solo... :-(


Il problema con solo avere queste due condizioni:

  <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
  <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />

è che funzionano solo finché il {REQUEST_FILENAME} esiste fisicamente sul disco . Ciò significa che possono esistere scenari in cui una richiesta per una vista parziale con nome errato restituisce la pagina radice anziché un 404 che causerebbe il caricamento angolare due volte (e in alcuni scenari può causare un brutto ciclo infinito).

Pertanto, alcune regole di "fallback" sicure sarebbero raccomandate per evitare questi difficili problemi di risoluzione dei problemi:

  <add input="{REQUEST_FILENAME}" pattern="(.*?)\.html$" negate="true" />
  <add input="{REQUEST_FILENAME}" pattern="(.*?)\.js$" negate="true" />
  <add input="{REQUEST_FILENAME}" pattern="(.*?)\.css$" negate="true" />

o una condizione che corrisponde a qualsiasi file che termina :

<conditions>
  <!-- ... -->
  <add input="{REQUEST_FILENAME}" pattern=".*\.[\d\w]+$" negate="true" />
</conditions>

Nel mio caso ho continuato a ottenere un 403.14 dopo aver impostato le corrette regole di riscrittura. Risulta che ho avuto una directory che aveva lo stesso nome di una delle mie rotte URL. Una volta rimossa la regola di riscrittura IsDirectory, le mie route funzionavano correttamente. C'è un caso in cui la rimozione della negazione della directory può causare problemi? Non riesco a pensare a nessuno nel mio caso. L'unico caso a cui riesco a pensare è se puoi sfogliare una directory con la tua app.

<rule name="fixhtml5mode" stopProcessing="true">
  <match url=".*"/>
  <conditions logicalGrouping="MatchAll">
    <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
  </conditions>
  <action type="Rewrite" url="/" />
</rule>

Scrivo una regola in web.config dopo che $locationProvider.html5Mode(true) è impostato in app.js

Spero, aiuti qualcuno.

  <system.webServer>
    <rewrite>
      <rules>
        <rule name="AngularJS Routes" stopProcessing="true">
          <match url=".*" />
          <conditions logicalGrouping="MatchAll">
            <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
            <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
            <add input="{REQUEST_URI}" pattern="^/(api)" negate="true" />
          </conditions>
          <action type="Rewrite" url="/" />
        </rule>
      </rules>
    </rewrite>
  </system.webServer>

Nel mio index.html l'ho aggiunto a <head>

<base href="/">

Non dimenticare di installare IIS URL Rewrite sul server.

Inoltre, se si utilizza l'API Web e IIS, ciò funzionerà se l'API è in www.yourdomain.com/api causa del terzo input (terza riga di condizione).





angularjs