route reescritura instalar examples direccion data asp amigables all asp.net url-rewriting iis-7.5 domain-name

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$" .