web-dev-qa-db-fra.com

IIS7 URL Rewrite - Ajouter le préfixe "www"

Comment forcer exemple.com à être redirigé vers www.example.com avec la réécriture d'URL dans IIS7? Quel type de règle devrait figurer dans le fichier web.config? Merci.

23
niaher

Voici l'exemple de Microsoft pour URL Rewrite Module 2.0 qui redirige * .fabrikam.com vers www.fabrikam.com

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <rule name="Add www" patternSyntax="Wildcard" stopProcessing="true">
                    <match url="*" />
                    <conditions>
                        <add input="{HTTP_Host}" pattern="www.fabrikam.com" negate="true" />
                    </conditions>
                    <action type="Redirect" url="http://www.fabrikam.com/{R:1}" />
                </rule>
            </rules>
        </rewrite>
    </system.webServer>
</configuration>
27
orad

Pour le rendre plus générique, vous pouvez utiliser la règle de réécriture d'URL suivante qui fonctionne pour n'importe quel domaine:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
    <rewrite>
        <rules>
              <rule name="Add WWW" stopProcessing="true">
              <match url="^(.*)$" />
              <conditions>
                 <add input="{HTTP_Host}" pattern="^(?!www\.)(.*)$" />
              </conditions>
              <action type="Redirect" url="http://www.{C:0}{PATH_INFO}" redirectType="Permanent" />
           </rule>
        </rules>
    </rewrite>
</system.webServer>

28
Atashbahar

Pas sûr de la meilleure façon de faire cela, mais j'ai un site avec tous les anciens domaines/sous-domaines exécutant ce web.config:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <rule name="Transfer" stopProcessing="true">
                    <match url=".*" />
                    <action type="Redirect" url="http://www.targetsite.com/{R:0}" redirectType="Permanent" />
                </rule>
            </rules>
        </rewrite>
    </system.webServer>
</configuration>

Semble faire le travail.

3
Sciolist

Je ne suis pas sûr que cela aide, mais j'ai choisi de le faire au niveau de l'application. Voici un filtre d'action rapide que j'ai écrit pour le faire. Ajoutez simplement la classe quelque part dans votre projet, puis vous pouvez ajouter [RequiertWwww] à une action unique ou à un contrôleur entier. 

public class RequiresWww : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            HttpRequestBase req = filterContext.HttpContext.Request;
            HttpResponseBase res = filterContext.HttpContext.Response;

            //IsLocal and IsLoopback i'm not too sure on the differences here, but I have both to eliminate local dev conditions. 
            if (!req.IsLocal && !req.Url.Host.StartsWith("www") && !req.Url.IsLoopback)
            {
                var builder = new UriBuilder(req.Url)
                {
                    Host = "www." + req.Url.Host
                };

                res.Redirect(builder.Uri.ToString());

            }

            base.OnActionExecuting(filterContext);
        }
    }

Ensuite 

[RequiresWwww]
public ActionResult AGreatAction()
{
...
}

ou 

[RequiresWwww]
public class HomeController : BaseAppController 
{
..
..
}

J'espère que ça aide quelqu'un. À votre santé!

0
Marc D.