web-dev-qa-db-fra.com

IIS URL Rewrite et Web.config

Je ne comprends rien à IIS, mais j'essaie de résoudre ce problème de redirection de tous les visiteurs vers domain.com/page vers domain.com/page.html.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.webServer>
    <rewrite>
          <rewriteMaps>
              <rewriteMap name="StaticRedirects">
                  <add key="/page" value="/page.html" />
              </rewriteMap>
            </rewriteMaps>
      </rewrite>
  </system.webServer>
</configuration>

Quelques problèmes se posent:

  1. Je ne sais même pas où mettre le fichier. Il y a un répertoire racine de l'utilisateur et un répertoire htdocs, j'ai essayé les deux, pas de joie.
  2. Je ne sais même pas si le compte peut faire des réécritures, j'essaie de le savoir.
54
J. Martin

1) Votre web.config existant: vous avez déclaré la carte de réécriture .. mais vous n'avez pas créé de règles qui l'utilisent. RewriteMap seul ne fait absolument rien.

2) Voici comment vous pouvez le faire (il n’utilise pas de cartes de réécriture - règles seulement, ce qui est correct pour un petit nombre de réécritures/redirections):

Cette règle fera SINGLE EXACT rewrite (redirect interne) /page à /page.html. L'URL dans le navigateur restera inchangé.

<system.webServer>
    <rewrite>
        <rules>
            <rule name="SpecificRewrite" stopProcessing="true">
                <match url="^page$" />
                <action type="Rewrite" url="/page.html" />
            </rule>
        </rules>
    </rewrite>
</system.webServer>

Cette règle n ° 2 fera la même chose que ci-dessus, mais fera la redirection 301 (redirection permanente) où l'URL changera dans le navigateur.

<system.webServer>
    <rewrite>
        <rules>
            <rule name="SpecificRedirect" stopProcessing="true">
                <match url="^page$" />
                <action type="Redirect" url="/page.html" />
            </rule>
        </rules>
    </rewrite>
</system.webServer>

La règle n ° 3 tentera d’exécuter cette réécriture pour TOUT URL s’il existe un tel fichier avec une extension .html (c.-à-d. Pour /page il vérifiera si /page.html existe, et si c'est le cas, une réécriture se produit):

<system.webServer>
    <rewrite>
        <rules>
            <rule name="DynamicRewrite" stopProcessing="true">
                <match url="(.*)" />
                <conditions>
                    <add input="{REQUEST_FILENAME}\.html" matchType="IsFile" />
                </conditions>
                <action type="Rewrite" url="/{R:1}.html" />
            </rule>
        </rules>
    </rewrite>
</system.webServer>
113
LazyOne

Je voulais juste souligner une chose qui manque dans la réponse de LazyOne (j'aurais juste commenté sous la réponse mais je n'ai pas assez de représentants)

Dans la règle n ° 2 pour la redirection permanente, il manque un élément:

redirectType="Permanent"

Donc la règle n ° 2 devrait ressembler à ceci:

<system.webServer>
    <rewrite>
        <rules>
            <rule name="SpecificRedirect" stopProcessing="true">
                <match url="^page$" />
                <action type="Redirect" url="/page.html" redirectType="Permanent" />
            </rule>
        </rules>
    </rewrite>
</system.webServer>

Modifier

Pour plus d'informations sur l'utilisation du module URL Rewrite, consultez cette excellente documentation: Référence de configuration du module URL Rewrite

En réponse à la question @kneidels des commentaires; Pour correspondre à l'URL: topic.php?id=39 quelque chose comme ce qui suit pourrait être utilisé:

<system.webServer>
  <rewrite>
    <rules>
      <rule name="SpecificRedirect" stopProcessing="true">
        <match url="^topic.php$" />
        <conditions logicalGrouping="MatchAll">
          <add input="{QUERY_STRING}" pattern="(?:id)=(\d{2})" />
        </conditions>
        <action type="Redirect" url="/newpage/{C:1}" appendQueryString="false" redirectType="Permanent" />
      </rule>
    </rules>
  </rewrite>
</system.webServer>

Cela correspondra à topic.php?id=aba est un nombre quelconque compris entre 0-9 et b est également un nombre quelconque compris entre 0-9. Il sera ensuite redirigé vers /newpage/xyxy provient de l'URL d'origine. Je n'ai pas testé cela mais ça devrait marcher.

13
Hjalti

Je viens d’essayer cette règle, et cela fonctionnait avec l’hébergement GoDaddy puisqu’ils avaient déjà installé le module Microsoft URL Rewriting pour chaque compte IIS 7.

<rewrite>
  <rules>
    <rule name="enquiry" stopProcessing="true">
      <match url="^enquiry$" />
      <action type="Rewrite" url="/Enquiry.aspx" />
    </rule>
  </rules>
</rewrite>
10
nolimit