2010-04-27 4 views
13

Comment puis-je définir une URL de redirection pour un répertoire virtuel dans IIS 7.0? J'ai installé le dernier module de réécriture d'url 2.x.URL de redirection IIS pour le répertoire virtuel

Je peux expliquer mon problème avec un exemple:

J'ai un site Web sur mon serveur IIS 7.0, www.mysite.com. J'ai décidé de créer un répertoire virtuel "ventes" sous mon site qui pointe vers le répertoire racine du site. Maintenant, je dois créer une URL de redirection pour le vdir. Le vdir pointe vers le même répertoire racine virtuel que ma racine de site.

La grande idée est que je peux aller à www.mysite/sales et je redirigerai automatiquement à www.mysite.com?productid=200.

J'ai essayé de rediriger une url rewrite pour vdir (pas le site web), mais je reçois toujours ce message d'erreur:

Cannot add duplicate collection entry of type 'rule' with unique key 
attribute 'name' set to "test". 

Cela se produit lorsque je montre le vdir virtuel et essayez d'ajouter une règle .

Je peux ajouter des règles au niveau du site Web, mais les règles ne fonctionnent pas. Je veux dire url "www.mysite/sales" me donne l'erreur suivante. Je sais que cette clé est unique. Je l'ai vérifié depuis web.config.

Ce type de fonctionnalité était très facile à utiliser dans IIS 6.0, pointez simplement sur vdir avec votre souris et définissez les propriétés -> une redirection vers URL.

Quelqu'un peut-il expliquer quelle est la bonne façon de le faire dans IIS 7.0?

+0

Voir [URL de Réécriture d'un sous-répertoire vers un autre domaine en utilisant IIS] aussi (https://stackoverflow.com/questions/22392522/url-rewrite-of-a-subdirectory-to-a-different- domain-using-iis) sur forward au lieu de redirect. – Vadzim

Répondre

28

En fait pas tout à fait aussi facile, mais pas trop horrible.

1) Créez un répertoire physique au lieu d'un répertoire virtuel.

2) Assurez-vous d'avoir les services de rôle Redirection HTTP. Voir http://www.iis.net/ConfigReference/system.webServer/httpRedirect

3) Ouvrez le Gestionnaire des services Internet et accédez au répertoire physique que vous souhaitez rediriger.

4) Double-cliquez sur l'icône 'Redirection HTTP' sous IIS.

5) Cochez la case « Rediriger les demandes vers cette destination » et entrez la nouvelle URL (http://example.com/newPage.html)

6) Vérifiez les deux cases suivantes en fonction des besoins; Je trouve généralement nécessaire de vérifier les deux.

7) Appuyez sur le bouton Appliquer.

8) Sélectionnez le site Web et «Redémarrer» sous Gérer le site Web.

9) Test.

+0

Bonne réponse, +1 – ajdams

+0

Merci cela aidé –

+0

A fonctionné très bien, mais je n'ai pas eu besoin de redémarrer le site dans IIS 8.5. –

2

La raison pour laquelle cela se produit est que, par défaut, toutes les configurations de règles sont héritées des applications Web parentes. Ainsi, si une règle est définie dans le site Web racine, elle est héritée sur tous les sites Web enfants suivants dans la hiérarchie; sauf si elle est effacée.

Ainsi, par exemple, si la hiérarchie d'applications IIS est comme suit -

Site Web par défaut (racine)

| Application Web 1 (VDir1) | Web Sous application 11 (VDir2)

| Application Web 2 (VDir3)

La règle avec un nom 'Test' si elle existe dans l'application racine, il obtient hérité de Web Application 1, Application Web 11 et application Web 2

Dans votre cas Web L'application 11 (VDir2) est physiquement au même emplacement que (VDir1). Par conséquent, les configurations IIS sont les mêmes pour les deux répertoires car il partage le même fichier Web.config.

Ainsi, toute nouvelle règle ajoutée au fichier Web.config sera automatiquement appliquée à ces deux répertoires virtuels (VDir1 & VDir2). Et puisque les règles sont héritées par défaut, le moteur de règles dans IIS trouvera un problème lors de l'analyse de la règle, car il existe déjà par héritage.

Une solution possible consisterait à ajouter une balise < Clear /> avant d'ajouter une règle dans le fichier web.config afin qu'elle efface toute règle héritée.

<rewrite> 
    <rules> 
    <clear/> 
    <rule name="test" stopProcessing="true"> 
     <match xxx /> 
     <action xxx /> 
    </rule> 
    </rules> 
</rewrite> 

Cependant, je préférerais le < Supprimer name = « Nom de la règle » /> balise au lieu de cibler uniquement la suppression de la règle qui doivent être ajoutés dans la configuration héritée. Cela garantirait que toutes les autres règles du site Web racine sont héritées dans la hiérarchie; avec seulement cette nouvelle règle étant (en quelque sorte) surchargée.

<rewrite> 
    <rules> 
    <remove name="test"/> 
    <rule name="test" stopProcessing="true"> 
     <match xxx /> 
     <action xxx /> 
    </rule> 
    </rules> 
</rewrite> 
+0

Est-ce que cela fonctionne réellement? C'est un génie. – Gaspa79

+0

@ Gaspa79, c'est sûr. vous pouvez l'essayer et afficher vos résultats. – XpertSiji

+0

Ouais je l'ai essayé et a fait des merveilles. Merci beaucoup! – Gaspa79

Questions connexes