Consegui fazer isso funcionar.
O primeiro obstáculo foi que eu não percebi que nem todos os tipos de correspondência condicional estão disponíveis no escopo global (que era onde eu estava escrevendo minhas regras). Apenas Pattern
estava disponível. Tive que alterar o escopo para o escopo "distribuído" (regras por site) para obter acesso aos tipos de correspondência IsFile
e IsDirectory
.
Então, a partir daí, eu poderia escrever minhas regras com algum tipo de hierarquia. Primeiro reescreva para coincidir com o padrão que eu quero tentar primeiro, então se ele não resolver para um arquivo, reescreva-o para o próximo padrão e repita.
<rule name="try in project/content" stopProcessing="false">
<match url=".*" />
<action type="Rewrite" url="project/content/{R:0}" />
</rule>
<rule name="verify project/content" stopProcessing="false">
<match url="(project)/content(/.*)" />
<conditions logicalGrouping="MatchAll">
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
</conditions>
<action type="Rewrite" url="{R:1}{R:2}" />
</rule>
No meu caso particular, eu queria tentar primeiro um subdiretório em particular, depois tentar os diretórios-pai, se eles não existissem. Mas eu poderia, teoricamente, fazer isso para qualquer conjunto de caminhos, desde que eu saiba em que ordem experimentá-los.
Então, para o meu exemplo na pergunta, eu definiria essas regras:
<rule name="try in someproject1" stopProcessing="false">
<match url=".*" />
<action type="Rewrite" url="someproject1/{R:0}" />
</rule>
<rule name="try in someproject2 otherwise" stopProcessing="false">
<match url="someproject1/(.*)" />
<conditions logicalGrouping="MatchAll">
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
</conditions>
<action type="Rewrite" url="someproject2/{R:1}" />
</rule>
<rule name="try in someotherproject otherwise" stopProcessing="false">
<match url="someproject2/(.*)" />
<conditions logicalGrouping="MatchAll">
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
</conditions>
<action type="Rewrite" url="someotherproject/{R:1}" />
</rule>
<rule name="fallback to root otherwise" stopProcessing="false">
<match url="someotherproject/(.*)" />
<conditions logicalGrouping="MatchAll">
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
</conditions>
<action type="Rewrite" url="{R:1}" />
</rule>