asp.net - instalar - IIS 7.5 Reglas canónicas de reescritura de URL para dominios múltiples
url rewrite iis 10 (1)
En el contexto de URL Rewrite 2.0 en IIS 7.5 , deseo poder imponer nombres de dominio canónicos para múltiples dominios para un sitio de varios países, en la menor cantidad de reglas posible. Algo como esto:
<rule name="UK Host Name">
<match url="(.*)" />
<conditions logicalGrouping="MatchAll">
<add input="{HTTP_HOST}" pattern="^company/.co/.uk$" />
<add input="{HTTP_HOST}" pattern="^company/.co$" />
<add input="{HTTP_HOST}" pattern="^company/.org$" />
<add input="{HTTP_HOST}" pattern="^company/.net$" />
<add input="{HTTP_HOST}" pattern="^company/.uk/.com$" />
<add input="{HTTP_HOST}" pattern="^www/.company/.co/.uk$" negate="true" />
</conditions>
<action type="Redirect" url="http://www.company.co.uk/{R:1}" />
</rule>
<rule name="France Host Name">
<match url="(.*)" />
<conditions logicalGrouping="MatchAll">
<add input="{HTTP_HOST}" pattern="^company/.fr$" />
<add input="{HTTP_HOST}" pattern="^company-france/.com$" />
<add input="{HTTP_HOST}" pattern="^www/.company/.fr$" negate="true" />
</conditions>
<action type="Redirect" url="http://www.company.fr/{R:1}" />
</rule>
El problema con lo anterior, creo, es que cada una de esas condiciones debe ser verdadera, por logicalGrouping="MatchAll"
tanto, logicalGrouping="MatchAll"
pero si se cambia a MatchAny
se MatchAny
la última condición (con negate="true"
), lo que significa que ejecutaremos el redireccionamiento regla incluso si el usuario visita el dominio correcto.
La única alternativa que puedo pensar es tener una regla de reescritura por separado para cada dominio diferente, pero podría haber un gran número de dominios y podría ser complicado. Habrá muchas otras reglas y mapas de reescritura como están.
¿Cómo puedo crear conjuntos más complejos de condiciones, en lugar de solo All or Any?
El truco consiste en combinar los dominios con los que quieres hacer coincidir en una regla con o |
operador para que solo tenga una regla ''positiva'' y una regla ''negativa'' que debe MatchAll
. P.ej:
<rule name="UK Host Name">
<match url="(.*)" />
<conditions logicalGrouping="MatchAll">
<add input="{HTTP_HOST}" pattern="^company/.(co(/.uk)?|org|net|uk/.com)$" />
<add input="{HTTP_HOST}" pattern="^www/.company/.co/.uk$" negate="true" />
</conditions>
<action type="Redirect" url="http://www.company.co.uk/{R:1}" />
</rule>
<rule name="France Host Name">
<match url="(.*)" />
<conditions logicalGrouping="MatchAll">
<add input="{HTTP_HOST}" pattern="^company(-france)?/.(fr|com)$" />
<add input="{HTTP_HOST}" pattern="^www/.company/.fr$" negate="true" />
</conditions>
<action type="Redirect" url="http://www.company.fr/{R:1}" />
</rule>
Eventualmente, esto podría darle una pequeña posibilidad de que su expresión regular coincida con demasiados nombres de dominio. Por ejemplo, el patrón de pattern="^company(-france)?/.(fr|com)$"
también coincide con company.com
que podría no ser deseable. En ese caso, debe ser más específico y, por ejemplo, cambiar el patrón a pattern="^company/.fr|company-france/.com$"
.