Tente reescrever para um URL diferente se isso resultasse em 404

0

Eu tenho um servidor tomcat local que estou desenvolvendo para usar minha instância local do IIS como proxy.

Eu faço isso porque a implantação do servidor é um processo doloroso, já que muito do conteúdo não é (o que eu descreveria como) auto-contido. O conteúdo de diferentes projetos é essencialmente copiado para a raiz do servidor. Eu não queria lidar com o incômodo de configurar isso com a ajuda do módulo de reescrita, eu poderia reescrever URLs para diretórios virtuais na maior parte do tempo.

por exemplo,

/js/* -> /someproject/js/*
/css/* -> /someproject/css/*
/**/*.pdf -> /someotherproject/pdf/*

Existem, no entanto, alguns casos em que esse esquema não funciona, especialmente quando há sobreposição nos diretórios de destino. Na implantação, alguns recursos são colocados no mesmo diretório, portanto não há uma maneira real de distinguir qual é qual. Não há um padrão estrito para esses arquivos, é tudo um saco misto.

por exemplo,

/someproject1/file1.txt -> /file1.txt
/someproject2/book2.doc -> /book2.doc

Então, considerando um url /file1.txt , não sei se posso reescrever para ir para someproject1 ou someproject2 . Então eu estou pensando que eu poderia fazer isso funcionar se houvesse algum tipo de hierarquia para quais URLs tentar reescrever. Por isso, posso usar uma URL como /file3.txt , reescrever para o primeiro desses padrões que parece válido.

/someproject1/file3.txt     # if 404, try the next
/someproject2/file3.txt     # if 404, try the next
/someotherproject/file3.txt # if 404, try the next
/file3.txt                  # fallback

Isso é algo que só pode ser expresso usando o módulo de reescrita de URL?

    
por Jeff Mercado 19.09.2015 / 01:41

1 resposta

0

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>
    
por 23.09.2015 / 02:14