Pergunta

Eu estou usando Mod Rewrite para o IIS 7.0 a partir iis.net e quer redirecionar solicitações:

Eu criei 2 regras:

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

Ele passa um teste em diálogo iis teste mmc, mas não na depuração (URL como http: // localhost: 9080 / example.com / usuários / 1 ou ... / usuários / foo ) e não no IIS verdadeiro

O que eu fiz de errado?

Foi útil?

Solução

O problema óbvio é que suas expressões regulares atuais só corresponder a um caractere no nome de usuário ou um número. Você vai precisar adicionar um plus quantificador dentro dos parênteses, a fim de corresponder a vários letras ou números. Consulte desta página para obter mais informações sobre os quantificadores regex. Nota que você não vai ser correspondência URLs simples como "/ users /" (sem ID ou nome). Certifique-se é isso que você pretendia.

O outro problema que você está correndo em é que o IIS avalia regras de reescrita a partir do primeiro caractere após a barra inicial. Assim, a regra de jogo /users/([0-9]) não irá corresponder a qualquer coisa, porque quando a avaliação regex acontece, os olhares de URL como users/foo não /users/foo. A solução é usar ^ (que é o personagem regex que significa "começar de string") no início do padrão em vez de uma barra. Como esta:

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

Note que você está escolhendo Users.aspx para uma dessas URLs e User.aspx (sem plural) para o outro. Certifique-se é isso que você pretendia.

BTW, a maneira que eu percebi essas coisas estava usando IIS Falha solicitação de rastreamento para solucionar problemas reescrever as regras . Isso fez com que o diagnóstico desta realmente fácil. Eu era capaz de fazer uma solicitação de teste e olhar através do rastreamento para localizar onde cada regra de reescrita está sendo avaliada (é em uma seção do traço chamado "PATTERN_MATCH" Para o PATTERN_MATCH particular para uma das suas regras, eu vi isso:.

-PATTERN_MATCH
Padrão / usuários / ([0-9] +?)
usuários InputURL / 1 | Negar falsa
falsa combinado

Note a falta da barra começo.

Outras dicas

Você deve usar <match url="/users/([0-9]+)" /> e <match url="/users/([a-z]+)" ignoreCase="true" />, respectivamente, para coincidir com o id / usuário completo e não apenas a sua primeira letra / dígito. Mas eu não sei por que seu regex teria falhado em um único dígito, então deve haver uma outra questão, também.

Quanto à sua segunda pergunta, eu não tenho certeza se entendi completamente. Como você pode dizer a diferença entre um nome de pasta e um nome de usuário? Será uma pasta sempre tem uma barra no final?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top