Intente reescribir en una URL diferente si el resultado es 404

Intente reescribir en una URL diferente si el resultado es 404

Tengo un servidor Tomcat local que estoy desarrollando para usar mi instancia IIS local como proxy.

Hago esto porque implementar el servidor es un proceso doloroso ya que gran parte del contenido no es (lo que yo describiría como) autónomo. Básicamente, el contenido de diferentes proyectos se copia a la raíz del servidor. No quería lidiar con la molestia de configurarlo, así que con la ayuda del módulo de reescritura, podía reescribir las URL en directorios virtuales en su mayor parte.

p.ej,

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

Sin embargo, hay algunos casos extremos en los que este esquema no funciona, particularmente cuando hay superposición en los directorios de destino. En la implementación, algunos recursos se colocan en el mismo directorio, por lo que no hay una forma real de distinguir cuál es cuál. No existe un patrón estricto para estos archivos, todo es una mezcla.

p.ej,

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

Entonces, dada una URL /file1.txt, no sabría si puedo reescribirla para ir a someproject1o someproject2. Así que estoy pensando que podría hacer que esto funcione si hubiera algún tipo de jerarquía sobre las URL que intentar reescribir. Entonces, podría tomar una URL como /file3.txty reescribir el primero de estos patrones que parezca 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

¿Es esto algo que sólo se puede expresar usando el módulo de reescritura de URL?

Respuesta1

Pude hacer que esto funcionara.

El primer obstáculo fue que no me di cuenta de que no todos los tipos de coincidencias condicionales están disponibles en el ámbito global (que era donde estaba escribiendo mis reglas). Sólo Patternestaba disponible. Tuve que cambiar el alcance al alcance "distribuido" (reglas por sitio) para obtener acceso a los tipos de IsFilecoincidencia IsDirectory.

Luego, a partir de ahí, podría escribir mis reglas con algún tipo de jerarquía. Primero vuelva a escribir para que coincida con el patrón que quiero probar primero, luego, si no se resuelve en un archivo, vuelva a escribirlo en el siguiente patrón y 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>

En mi caso particular, quería probar primero con un subdirectorio en particular y luego con los directorios principales si no existían. Pero, en teoría, podría hacer esto para cualquier conjunto de caminos, siempre que sepa en qué orden probarlos.


Entonces, para mi ejemplo en la pregunta, establecería estas reglas:

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

información relacionada