Domanda

Sto usando Mod Rewrite per IIS 7.0 da iis.net e voglio reindirizzare le richieste:

Ho creato 2 regole:

<rule name="ID">
   <match url="/users/([0-9])" />
   <action type="Rewrite" url="/User.aspx?id={R:1}" />
</rule>
<rule name="Name">
   <match url="/users/([a-z])" ignoreCase="true" />
   <action type="Rewrite" url="/User.aspx?name={R:1}" />
</rule>

Passa un test nella finestra di dialogo di test di iis mmc, ma non nel debug (URL come http: // localhost: 9080 / example.com / users / 1 o & # 8230; / users / foo ) e non attivo vero IIS!

Che cosa ho fatto di sbagliato?

È stato utile?

Soluzione

Il problema evidente è che le tue regex attuali corrispondono solo a un carattere nel nome utente o in un numero. Dovrai aggiungere un quantificatore positivo tra parentesi per abbinare più lettere o numeri. Vedi questa pagina per maggiori informazioni sui quantificatori regex. Nota che non corrisponderai a URL semplici come & Quot; / users / & Quot; (nessun ID o nome). Assicurati che sia quello che volevi.

L'altro problema che stai riscontrando è che IIS valuta le regole di riscrittura a partire dal primo carattere dopo la barra iniziale. Quindi la tua regola per abbinare /users/([0-9]) non corrisponderà a nulla perché quando si verifica la valutazione regex, l'URL appare come users/foo non /users/foo. La soluzione è usare ^ (che è il carattere regex che significa & Quot; inizio della stringa & Quot;) all'inizio del modello invece di una barra. In questo modo:

<rule name="ID">
    <match url="^users/([0-9]+)" />
    <action type="Rewrite" url="/User.aspx?id={R:1}" />
</rule>
<rule name="Name">
    <match url="^users/([a-z]+)" ignoreCase="true" />
    <action type="Rewrite" url="/Users.aspx?name={R:1}" />
</rule>

Nota che stai scegliendo Users.aspx per uno di questi URL e User.aspx (nessun plurale) per l'altro. Assicurati che sia quello che volevi.

A proposito, il modo in cui ho capito queste cose era usando Traccia richieste IIS non riuscite per la risoluzione dei problemi di riscrittura delle regole . Ciò ha reso la diagnosi molto semplice. Sono stato in grado di effettuare una richiesta di test e di esaminare la traccia per trovare dove viene valutata ogni regola di riscrittura (si trova in una sezione della traccia chiamata & Quot; PATTERN_MATCH & Quot ;. Per il particolare PATTERN_MATCH per uno di le tue regole, ho visto questo:

  

-PATTERN_MATCH
  Pattern / users / ([0-9] +?)
  Utenti InputURL / 1
  Annulla falso
  Falso abbinato

Nota la mancanza della barra iniziale.

Altri suggerimenti

Dovresti usare <match url="/users/([0-9]+)" /> e <match url="/users/([a-z]+)" ignoreCase="true" />, rispettivamente, per abbinare l'id / utente completo e non solo la loro prima lettera / cifra. Ma non so perché la tua regex sarebbe fallita su una sola cifra, quindi ci deve essere anche un altro problema.

Per quanto riguarda la tua seconda domanda, non sono sicuro di aver capito completamente. Come si può distinguere tra il nome di una cartella e un nome utente? Una cartella avrà sempre una barra finale?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top