web-dev-qa-db-fra.com

Problème de réécriture d'URL sur IIS7.5

Mon objectif est de créer des URL conviviales pour un site Web hébergé sur IIS 7.5.

Le site comporte 3 pages avec les URL suivantes:

  • http://www.example.com/contact.php?langid=1&title=contact
  • http://www.example.com/technology.php?langid=1&title=technology
  • http://www.example.com/clients.php?langid=1&title=clients

Je voudrais les URL dans ce format:

  • http://www.example.com/1/contact/
  • http://www.example.com/1/technology/
  • http://www.example.com/1/clients

Lorsque je crée les URL conviviales dans l'assistant IIS, il utilise le même modèle d'URL.

^([^/]+)/([^/]+)/?$

pour chacune des règles. Cela signifie simplement que les 3 URL redirigent vers la même page.

le fichier web.config ressemble à ceci:

    <?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <clear />
            <rule name="RedirectUserFriendlyURL1" stopProcessing="true">
                    <match url="^clients\.php$" />
                    <conditions>
                        <add input="{REQUEST_METHOD}" pattern="^POST$" negate="true" />
                        <add input="{QUERY_STRING}" pattern="^langid=([^=&amp;]+)&amp;title=([^=&amp;]+)$" />
                    </conditions>
                    <action type="Redirect" url="{C:1}/{C:2}" appendQueryString="false" />
                </rule>
                <rule name="RewriteUserFriendlyURL1" stopProcessing="true">
                    <match url="^([^/]+)/([^/]+)/?$" />
                    <conditions>
                        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
                        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
                    </conditions>
                    <action type="Rewrite" url="clients.php?langid={R:1}&amp;title={R:2}" />
                </rule>
                <rule name="RedirectUserFriendlyURL2" stopProcessing="true">
                    <match url="^contact\.php$" />
                    <conditions>
                        <add input="{REQUEST_METHOD}" pattern="^POST$" negate="true" />
                        <add input="{QUERY_STRING}" pattern="^langid=([^=&amp;]+)&amp;title=([^=&amp;]+)$" />
                    </conditions>
                    <action type="Redirect" url="{C:1}/{C:2}" appendQueryString="false" />
                </rule>
                <rule name="RewriteUserFriendlyURL2" stopProcessing="true">
                    <match url="^([^/]+)/([^/]+)/?$" />
                    <conditions>
                        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
                        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
                    </conditions>
                    <action type="Rewrite" url="contact.php?langid={R:1}&amp;title={R:2}" />
                </rule>
</rules>
            <outboundRules>
                <clear />
                <rule name="OutboundRewriteUserFriendlyURL1" preCondition="ResponseIsHtml1">
                    <match filterByTags="A, Form, Img" pattern="^(.*/)clients\.php\?langid=([^=&amp;]+)&amp;(?:amp;)?title=([^=&amp;]+)$" />
                    <action type="Rewrite" value="{R:1}{R:2}/{R:3}/" />
                </rule>
                <rule name="OutboundRewriteUserFriendlyURL2" preCondition="ResponseIsHtml1">
                    <match filterByTags="A, Form, Img" pattern="^(.*/)contact\.php\?langid=([^=&amp;]+)&amp;(?:amp;)?title=([^=&amp;]+)$" />
                    <action type="Rewrite" value="{R:1}{R:2}/{R:3}/" />
                </rule>
                <preConditions>
                    <preCondition name="ResponseIsHtml1">
                        <add input="{RESPONSE_CONTENT_TYPE}" pattern="^text/html" />
                    </preCondition>
                </preConditions>
            </outboundRules>
        </rewrite>
        <urlCompression doDynamicCompression="false" />
    </system.webServer>
</configuration>

Des suggestions comment faire ceci correctement?

2
Dog

Le problème est que l'action est codée de manière à utiliser le même nom de fichier. Vous pouvez ajouter des conditions supplémentaires et dupliquer les règles, mais une option plus simple consisterait à modifier l'URL de l'action RewriteUserFriendlyURL2 en:

{R:2}.php?langid={R:1}&amp;title={R:2}

Si le paramètre title est toujours égal au nom du fichier.

1